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


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.