簡體   English   中英

在python中逐行讀取一個大的壓縮文本文件

[英]Read a large zipped text file line by line in python

我正在嘗試使用 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 中做到這一點的方法。 幫助將不勝感激。

Python 文件對象提供迭代器,它將逐行讀取。 file.readlines()讀取所有內容並返回一個列表 - 這意味着它需要將所有內容讀入內存。 更好的方法(應該始終優先於readlines() )是只循環對象本身,例如:

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

請注意我使用with語句- 文件對象是上下文管理器,with 語句讓我們可以輕松編寫可讀代碼,確保在退出塊時關閉文件(即使出現異常)。 同樣,在處理文件時應該始終使用它。

如果壓縮文件中的內部目錄和子目錄文件名無關緊要,您可以嘗試以下操作:

from zipfile import ZipFile
from io import TextIOWrapper

def zip_open(filename):
    """Wrapper function that for zipfiles."""
    with ZipFile(filename) as zipfin:
        for filename in zipfin.namelist():
            return TextIOWrapper(zipfin.open(filename))

# Usage of the zip_open function)
with zip_open('myzipball.zip') as fin:
    for line in fin:
        print(line)

當 zipfile 包含一個或多個沒有子目錄的文件時, zip_open可以很好地工作。 如果壓縮文件中有復雜的子目錄結構, for filename in zipfin.namelist()是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM