读取换行符分隔文件并丢弃换行符的最佳方法?


84

我正在尝试确定在Python中读取换行符分隔文件时处理换行符的最佳方法。

我想出的是以下代码,包括一次性代码以进行测试。

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

有什么建议吗?


使用split(“ / n”)怎么办?
jle


我认为这将是更好地关闭文件,以及
帕维尔Prażak

Answers:


196
lines = open(filename).read().splitlines()

1
这个答案可以满足我的需求,我敢肯定,我需要添加一些错误检查等功能,但是对于这种特定的需求,这很好。谢谢大家提供答案!
solarce

我喜欢这个,但是如果不保存文件句柄,如何关闭文件?还是自动关闭?
IJ肯尼迪

6
使用CPython时,文件对象的引用计数将不再为零,并且文件将自动关闭。对于Jython和IronPython这样的纯GC实现,在GC运行之前可能不会关闭文件-因此,这种简短的变化可能不是最佳的。
Curt Hagenlocher

2
在具有8GB RAM的Mac OS X 10.7.5上,我可以读取最大2047MB的文件(我的定义:1 MB = 1024 x 1024字节)。2048MB将引发MemoryError异常。
Hai Vu 2013年

1
@WKPlus优秀问题-答案是“取决于” stackoverflow.com/a/15099341/994153(CPython 将关闭它,因为引用计数降至零,但是其他Python实现可能无法将其关闭,因此最好使其明确)
Colin D Bennett

23

这是一个发电机,可以完成您所要求的。在这种情况下,使用rstrip就足够了,并且比strip快一点。

lines = (line.rstrip('\n') for line in open(filename))

但是,您很可能也想使用它来摆脱尾随空格。

lines = (line.rstrip() for line in open(filename))

应该不是[]围绕RHS,而不是()吗?
2012年

8
@andrewb通过()给出了一个生成器表达式,其不作为多的内存使用如使用[](列表理解。)
乔纳森哈特利

9

您如何看待这种方法?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

生成器表达式避免将整个文件加载到内存中,并with确保关闭文件


这与@TimoLinna几年前发布的答案基本相同...
martineau,


4

只需使用生成器表达式:

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

我还建议您不要读取内存中的整个文件-在大型数据集上循环生成器效率更高。


3

我用这个

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

然后我可以做这样的事情。

lines = list( cleaned( open("file","r") ) )

或者,我可以扩展带有其他功能的清理功能,例如删除空白行或跳过注释行等。


2

我会这样:

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

尽管Curt Hagenlocher的答案在技术上更好,但是如果您需要在每行中添加其他处理,则此答案是一个很好的起点。
TomOnTime 2010年

不知道它是否打算过滤空白行,但是比更为简洁... if l.strip() is not '',这是我需要的。
Zach Young
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.