在python中逐行读取一个大的压缩文本文件

时间:2012-07-14 08:48:40

标签: python stream zip

我正在尝试使用zipfile模块来读取存档中的文件。未压缩文件大约为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);

dataStream是未压缩的。我似乎无法在Python中找到一种方法。将不胜感激。

1 个答案:

答案 0 :(得分:51)

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语句使我们可以轻松编写可读代码,以确保在退出块时关闭文件(即使在例外情况下)。在处理文件时,应始终使用此方法。