2011-06-29 116 views
1

基础知识是我需要在每行的基础上处理4gig文本文件。在Python中处理大文本文件

使用.readline()或for f中的line对于内存很好,但需要IO才能使用。想要使用像yield这样的东西,但是(我认为)会砍断线条。

可能的答案:

file.readlines([sizehint])¶ 
Read until EOF using readline() and return a list containing the lines 

如此读取。如果存在可选大小参数 参数,而不是 直到EOF,则会读取整个行 ,总计约为大小提示字节 (可能在舍入到内部缓冲区大小后可能会达到 )。 实现类似文件的接口的对象可能会选择忽略 尺寸提示(如果无法实现), 或无法有效实施。

没意识到你可以做到这一点!

+0

你解析日志文件吗?那就不要。有些图书馆可以做得更好。 –

+0

nananananananananananananana迭代器! (蝙蝠侠主题btw) –

+0

我正在查看大的安装文件和追加行。我试图让readlines()工作,但这很困难,它似乎没有按照要求移动到下一个块。 – jdborg

回答

7

你可以只遍历文件对象:

with open("filename") as f: 
    for line in f: 
     whatever 

这将做一些内部缓冲以提高性能。 (注意:file.readline()将执行相当差,因为它不缓冲 - 这就是为什么你不能用file.readline()在一个文件对象混合迭代。)

+0

这就是我使用.readline()的意思,在内存中这样做很好,但需要很长时间。 – jdborg

+0

@jdborg:'file.readline()'在迭代文件时的行为非常不同。迭代会为你做缓冲,不应该强加一个性能瓶颈。 –

0

如果你想要做的每行的基础的东西你可以遍历文件对象:

f = open("w00t.txt") 
for line in f: 
    # do stuff 

然而,在每行基础上做的东西可能是性能的实际瓶颈,因此,或许你应该使用更好的块​​大小?例如,您可以执行的操作是读取4096个字节,找到结尾为\n的最后一行,并在该部分上进行处理,并将部分留在下一个块中。

+0

这就是我使用.readline()的意思,在内存中这样做很好,但需要很长时间。 – jdborg

+0

@jdborg:阅读我答案的第二部分。 – orlp

0

你可以总是把排队?我的意思是,为什么打开一个文件并一直遍历,当你可以打开同一个文件6次并遍历。 例如

a #is the first 1024 bytes 
b #is the next 1024 
#etcetc 
f #is the last 1024 bytes 

每个文件句柄都在单独的进程中运行,我们开始用天然气做饭。只要记得妥善处理行结尾。