使用 Python Shutil 的 Zip 文件,如文件资源管理器

Zip File with Python Shutil like File Explorer

背景

我正在尝试使用 python shutil 压缩目录,如下所示:

shutil.make_archive("~/Desktop/zipfile", 'zip', "~/Documents/foldertozip")

但结果只压缩了里面的文件 "foldertozip"。例如,

foldertozip
    -- file1
    -- file2
zipfile.zip
    -- file1
    -- file2

另一方面,如果我从 windows 文件资源管理器或 mac 查找器中压缩它,我会得到以下内容:

foldertozip
    -- file1
    -- file2
zipfile.zip
    -- foldertozip
        -- file1
        -- file2

问题

如何使用 shutil 执行我可以从文件资源管理器执行的相同操作并包含基本目录?我知道我可以将 "foldertozip" 复制到具有相同名称的文件夹,然后压缩该文件夹,但如果可能的话,我更喜欢更干净的解决方案。

如果您同时通过 root_dirbase_dir

make_archive 将执行您想要的操作。参见 the docs

import shutil

shutil.make_archive('~/Desktop/zipfile', 'zip', '~/Documents/', 'foldertozip')

来自 make_archive 的文档:

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

创建存档文件(例如 zip 或 tar)并returns其名称。

base_name 是要创建的文件的名称,包括路径,减去任何格式特定的扩展名。 format 是存档格式:“zip”、“tar”、“bztar”或“gztar”之一。

root_dir 是将成为存档根目录的目录; IE。我们通常在创建存档之前将 chdir 放入 root_dir。

base_dir 是我们tart 归档的目录; IE。 base_dir 将是存档中所有文件和目录的公共前缀。

如果我理解正确的话,你需要让 base_dir 等于 "foldertozip" 并且 root_dir 等于 "foldertozip" 的父目录。

假设 foldertozip 在 "Documents"

所以这样的事情应该有效:

shutil.make_archive("~/Documents/zipfile", "zip", "~/Documents/", "foldertozip") 

让我们知道这是否符合您的预期!