Python 读取以换行符分隔的文件并丢弃换行符的最佳方法?
我试图确定在Python中读取以换行符分隔的文件时消除换行符的最佳方法 我想到的是以下代码,包括要测试的一次性代码Python 读取以换行符分隔的文件并丢弃换行符的最佳方法?,python,file,readline,Python,File,Readline,我试图确定在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 resu
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
建议?我会这样做:
lines = open(filename).read().splitlines()
f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l
这是一台发电机,它能满足你的要求。在这种情况下,使用rstrip就足够了,并且比strip快一点
lines = (line.rstrip('\n') for line in open(filename))
但是,您很可能也希望使用它来消除尾随空格
lines = (line.rstrip() for line in open(filename))
我用这个
def cleaned( aFile ):
for line in aFile:
yield line.strip()
然后我可以做这样的事情
lines = list( cleaned( open("file","r") ) )
或者,我可以使用额外的功能扩展cleaned,例如删除空行或跳过注释行或其他任何内容。只需使用生成器表达式:
blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
print x
另外,我想建议您不要在内存中读取整个文件——在大型数据集上循环生成器更有效。您对这种方法有何看法
with open(filename) as data:
datalines = (line.rstrip('\r\n') for line in data)
for line in datalines:
...do something awesome...
生成器表达式避免将整个文件加载到内存中,并且使用确保关闭文件使用拆分(“/n”)如何?相同:我认为最好也关闭文件这个答案符合我的要求,我确信我需要添加一些错误检查等,但是对于这个特定的需要,它非常好。谢谢大家提供答案!我喜欢这样,但是如果不保存文件句柄,如何关闭文件?或者它是自动关闭的?使用CPython,一旦不再使用,文件对象的引用计数将变为零,文件将自动关闭。对于纯GC的实现,如Jython和IronPython,在GC运行之前文件可能不会关闭——因此这种简洁的变化可能不是最优的。在具有8GB RAM的Mac OS X 10.7.5上,我可以读取高达2047MB的文件(我的定义:1MB=1024 X 1024字节)。2048MB将引发MemoryError异常。@WKPlus是一个很好的问题——答案是“这取决于”(由于引用计数降至零,CPython将关闭它,但其他Python实现可能不会关闭它,因此最好将其显式化),而Curt Hagenlocher的回答在技术上更好,如果您需要在每行中添加其他处理,这个答案是一个很好的起点。不确定它是否用于过滤空行,但这比
更简洁。。。如果l.strip()不是“”
,这正是我的情况所需要的。它不应该是围绕RHS的[],不是()?@andrewb Using()给出了一个生成器表达式,它使用的内存不如使用[](列表理解)。这与@Timolina几年前发布的内容基本相同。。。
with open(filename) as data:
datalines = (line.rstrip('\r\n') for line in data)
for line in datalines:
...do something awesome...