使用 Zipfile 模块 Python 实现大型 Zip 文件

问题描述 投票:0回答:1

我以前从未使用过zip文件模块。我有一个目录,其中包含我需要处理的数千个 zip 文件。这些文件最大可达 6GB。我浏览了一些文档,但其中很多文档并不清楚读取大型 zip 文件而不需要解压的最佳方法是什么。

我偶然发现了这个:在Python中逐行读取一个大的压缩文本文件

因此,在我的解决方案中,我尝试模拟它并使用它,就像我使用 with open 函数读取普通文本文件一样

with open(odfslogp_obj, 'rb', buffering=102400) as odfslog

所以我根据该链接的答案写了以下内容:

for odfslogp_obj in odfslogs_plist:
    with zipfile.ZipFile(odfslogp_obj, mode='r') as z:
        with z.open(buffering=102400) as f:
            for line in f:
                print(line)

但这给了我 z.open() 的“意外关键字”错误

问题是,是否有文档解释 z.open() 函数将采用哪些关键字?我只找到了一个 .ZipFile() 函数。

我想确保我的代码在逐行处理这些文件时不会占用太多内存。

odfslogp_obj 是一个 Path 对象顺便说一句

当我取消缓冲并只使用 z.open() 时,我收到一条错误消息:

TypeError: open() missing 1 required positional argument: 'name'

python python-3.x python-zipfile
1个回答
3
投票

打开 zip 文件后,您仍然需要打开其中包含的各个文件。这是您遇到的第二个

z.open
问题。它不是内置的 python
open
并且它没有“缓冲”参数。参见
ZipFile.open

打开 zip 文件后,您可以枚举其文件并依次打开它们。 ZipFile.open 以二进制模式打开,这可能是一个不同的问题,具体取决于您要对文件执行的操作。

for odfslogp_obj in odfslogs_plist:
    with zipfile.ZipFile(odfslogp_obj, mode='r') as z:
        for name in z.namelist():
            with z.open(name) as f:
                for line in f:
                    print(line)
© www.soinside.com 2019 - 2024. All rights reserved.