11

我通常在 Python 中读取这样的文件:

f = open('filename.txt', 'r')
for x in f:
    doStuff(x)
f.close()

但是,这会按换行符拆分文件。我现在有一个文件,它的所有信息都在一行中(45,000 个用逗号分隔的字符串)。虽然使用类似的东西读取这种大小的文件是微不足道的

f = open('filename.txt', 'r')
doStuff(f.read())
f.close()

我很好奇如果一个更大的文件都在一行中,是否可以实现与第一个代码片段类似的迭代效果,但用逗号而不是换行符或任何其他字符分割?

4

2 回答 2

9

以下函数是一种相当简单的方法来做你想做的事:

def file_split(f, delim=',', bufsize=1024):
    prev = ''
    while True:
        s = f.read(bufsize)
        if not s:
            break
        split = s.split(delim)
        if len(split) > 1:
            yield prev + split[0]
            prev = split[-1]
            for x in split[1:-1]:
                yield x
        else:
            prev += s
    if prev:
        yield prev

你会像这样使用它:

for item in file_split(open('filename.txt')):
    doStuff(item)

这应该比 EMS 链接的解决方案更快,并且对于大文件一次读取整个文件会节省大量内存。

于 2012-04-17T01:37:01.597 回答
1

使用 打开文件open(),然后使用该file.read(x)方法从文件中读取(大约)下一个x字节。您可以继续请求 4096 个字符的块,直到您到达文件末尾。

您必须自己实现拆分 - 您可以从csv模块中获取灵感,但我不相信您可以直接使用它,因为它不是为处理极长的行而设计的。

于 2012-04-17T01:13:53.870 回答