在python中按块解压缩文件夹

Posted

技术标签:

【中文标题】在python中按块解压缩文件夹【英文标题】:Unzip folder by chunks in python 【发布时间】:2017-02-23 14:08:19 【问题描述】:

我有一个很大的 zip 文件,其中包含许多我想按块解压缩的文件以避免消耗太多内存。

我尝试使用 python 模块zipfile,但我没有找到按块加载存档并将其提取到磁盘上的方法。

在 python 中有没有简单的方法来做到这一点?

编辑

@steven-rumbalski 正确地指出 zipfile 正确地处理大文件,无需加载完整存档即可逐个解压缩文件。

我的问题是我的 zip 文件在 AWS S3 上,而我的 EC2 实例无法在 RAM 中加载这么大的文件,所以我按块下载它,我想按块解压缩它。

【问题讨论】:

【参考方案1】:

您不需要特殊的方法来将大型存档解压到磁盘。源Lib/zipfile.py 表明zipfile 已经是内存高效的。创建zipfile.ZipFile 对象不会将整个文件读入内存。相反,它只是读取 ZIP 文件的目录。 ZipFile.extractall() 使用从io.BufferedIOBase 的子类复制的shutil.copyfileobj() 提取文件一次

如果您只想一次性提取 Python 提供的命令行快捷方式:

python -m zipfile -e archive.zip target-dir/

【讨论】:

你是对的 zipfile 处理得很好。但我的上下文有点复杂。关键是我的 zip 文件在 S3 服务器上,我无法加载完整的 zip,因为实例无法在 RAM 中处理它,所以我按块下载 zip 文件,我想按块解压缩 您不需要在 RAM 中保存整个文件。您仍然需要在磁盘上 有一个完整的文件,因为 zip 处理需要在文件内部进行查找。要将文件下载到磁盘,您也不需要将其全部读入内存;分块读取,分块写入临时文件,然后使用该文件,就足够了。 谢谢@9000,你也是对的。我只是希望我可以避免将文件写入磁盘。【参考方案2】:

您可以按如下方式使用 zipfile(或可能是 tarfile):

import zipfile

def extract_chunk(fn, directory, ix_begin, ix_end):
    with zipfile.ZipFile("/file.zip".format(directory), 'r') as zf:
        infos = zf.infolist()
        print(infos)
        for ix in range(max(0, ix_begin), min(ix_end, len(infos))):
                zf.extract(infos[ix], directory)
        zf.close()

directory = "path"
extract_chunk("/file.zip".format(directory), directory, 0, 50)

【讨论】:

参数ix_beginix_end 似乎没有使用。 (此外,这似乎试图解决与 OP 状态不同的问题。)

以上是关于在python中按块解压缩文件夹的主要内容,如果未能解决你的问题,请参考以下文章

使用iter_chunks()从S3中解压缩字节块。

Linux命令应用大词典-第16章 归档和压缩

如何在mac上正确压缩文件以通过python从s3解压缩?

python中如何压缩和解压缩文件

在 Python 中解压缩 .bz2 文件

python zipfile解压缩