2012-07-14 131 views
16

大压缩文本文件,行,我试图用zip文件模块读取文件中的档案。未压缩文件为〜3GB,压缩文件为200MB。我不希望他们在内存中,因为我一行一行地处理压缩文件。到目前为止,我已经使用下面的代码注意到一个内存过度使用:读取线蟒蛇

import zipfile 
f = open(...) 
z = zipfile.ZipFile(f) 
for line in zipfile.open(...).readlines() 
    print line 

我使用SharpZipLib做到了在C#:

var fStream = File.OpenRead("..."); 
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream); 
var dataStream = unzipper.GetInputStream(0); 

数据流被压缩。我似乎无法找到一种方法来在Python中完成它。帮助将不胜感激。

回答

38

的Python文件对象提供迭代器,将由线读取线。 file.readlines()将它们全部读取并返回一个列表 - 这意味着它需要将所有内容读入内存。更好的办法(应始终优先于readlines())是刚刚超过对象自身循环,例如:

import zipfile 
with zipfile.ZipFile(...) as z: 
    with z.open(...) as f: 
     for line in f: 
      print line 

注意我用的the with statement - 文件对象是上下文管理者和with语句让我们随便写可读代码确保文件在退出块时关闭(即使出现异常)。在处理文件时,应该始终使用这一点。

+0

不能说比这更好的 – 2012-07-14 08:55:32