[英]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.