【问题标题】:Python - Compress all files in a directory using zipfile modulePython - 使用 zipfile 模块压缩目录中的所有文件
【发布时间】:2017-05-18 00:47:51
【问题描述】:

我正在尝试使用 python zipfile 模块压缩文件夹中的所有文件(该文件夹没有任何子目录),但似乎无法获得所需的输出。

我有folderA 坐在F:\Projects\ProjectA\Folders\folderA and my script under F:\Projects\ProjectA\CodeA\zipcode.py 下。我想压缩文件夹 A 中的所有文件,以便生成的 zip 文件在 F:\Projects\ProjectA\Folders 下命名为 folderA.zip 并使用原始文件名。

唯一的问题是解压缩结果会产生 Folders\folderA 而不仅仅是 folderA。它与文件夹 A 到脚本的相对路径有关,但我似乎无法获得所需的结果。

#zipcode.py
import os
import zipfile

filepath = "F:/Projects/ProjectA/Folders/folderA"

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w')

for root, dirs, files in os.walk(filepath):
        for afile in files:
            archive.write(os.path.relpath(os.path.join(root, afile)))
        archive.close()

【问题讨论】:

    标签: python zipfile


    【解决方案1】:

    在您的循环中,使用 arcname 参数更改存档成员的名称:

    archive.write(os.path.join(root, afile),arcname=name_in_archive)
    

    在哪里

    name_in_archive = os.path.join(os.path.basename(filepath),afile)
    

    保留folderA 路径。

    我不确定的一件事(取决于 python 的版本)是您可能必须用斜杠替换 windows 反斜杠,以便 .zip 文件是可移植的。不痛:

    archive.write(os.path.join(root, afile),arcname=name_in_archive.replace(os.sep,"/"))
    

    请注意,我已经放弃了 os.path.relpath 调用,现在不需要了,因为我们可以完全控制存档中文件的名称。

    另请注意,打开存档时无需转换为绝对路径。 open 查找相对文件和绝对文件:

    archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w')
    

    可以写

    archive = zipfile.ZipFile(filepath + '.zip', 'w')
    

    【讨论】:

    • 我实际上希望输出 zip 文件包含一个名为 folderA 的文件夹,其中包含所有文件。以上将文件直接写入zip文件。
    • @Riz_K:我的第一个答案是正确的,但我的编辑添加了name_in_archive = os.path.join(os.path.basename(filepath),afile)。这会为您的所有文件添加 folderA 前缀。重要的一点是您知道如何控制存档中文件的名称。
    • 很好地拒绝了这个 7 个月前详细且被接受的答案。需要解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多