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

Posted

技术标签:

【中文标题】读取换行符分隔文件并丢弃换行符的最佳方法?【英文标题】:Best method for reading newline delimited files and discarding the newlines? 【发布时间】:2010-10-07 09:25:05 【问题描述】:

我正在尝试确定在 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") 怎么样? 同:***.com/questions/339537/… 我认为最好也关闭文件 这能回答你的问题吗? How to read a file without newlines? 【参考方案1】:
lines = open(filename).read().splitlines()

【讨论】:

这个答案符合我的要求,我确定我需要添加一些错误检查等,但对于这个特定的需求,它很棒。谢谢大家提供答案! 我喜欢这个,但是如果你不保存文件句柄,你如何关闭文件?还是自动关闭? 使用 CPython,文件对象的引用计数将在不再使用时归零,并且文件将自动关闭。对于像 Jython 和 IronPython 这样的纯 GC 实现,在 GC 运行之前文件可能不会关闭——因此这种简洁的变化可能不是最佳的。 在具有 8GB RAM 的 Mac OS X 10.7.5 上,我可以读取高达 2047MB 的文件(我的定义:1 MB = 1024 x 1024 字节)。 2048MB 会抛出 MemoryError 异常。 @WKPlus 很好的问题——答案是“它取决于”***.com/a/15099341/994153(CPython 将关闭它,因为引用计数降至零,但其他 Python 实现可能不会关闭它,所以最好让它明确)【参考方案2】:

这是一个满足您要求的生成器。在这种情况下,使用 rstrip 就足够了,而且比 strip 稍快。

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

但是,您很可能也希望使用它来消除尾随空格。

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

【讨论】:

RHS 周围不应该是 [],而不是 ()? @andrewb 使用 () 提供了一个生成器表达式,它使用的内存不如使用 [] (列表推导式)。【参考方案3】:

您如何看待这种方法?

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

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

【讨论】:

这与@TimoLinna 的answer 几年前发布的基本相同......【参考方案4】:
for line in file('/tmp/foo'):
    print line.strip('\n')

【讨论】:

【参考方案5】:

只需使用生成器表达式:

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

另外我想建议你不要在内存中读取整个文件——循环生成器在大数据集上效率更高。

【讨论】:

【参考方案6】:

我用这个

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

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

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

或者,我可以使用额外的功能扩展清理功能,例如,删除空白行或跳过注释行等。

【讨论】:

【参考方案7】:

我会这样做:

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

【讨论】:

虽然 Curt Hagenlocher 的答案在技术上更好,但如果您需要向每一行添加其他处理,则此答案是一个很好的起点。 不确定它是否旨在过滤空白行,但这比... if l.strip() is not '' 更简洁,这正是我所需要的。

以上是关于读取换行符分隔文件并丢弃换行符的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

从用逗号和换行符分隔的文件中读取数组

从文件中读取换行符分隔的项目

python读取以非换行符分隔的超大文件,并逐行输出

将文件读入以逗号和换行符分隔的向量

将逗号分隔的 JSON 转换为换行符分隔的节点

shell怎样随机读写遍历文件中指定分隔符的记录