使用 zipfile.write(path, arcname=...) 打包时,把 arcname 设成相对于源目录的路径。这样归档会保留子目录结构,成员名中也不会带本机的绝对路径。

按相对路径写入 ZIP
保存为 pack.py,待归档目录为 docs,输出在 docs 外。示例仅打包普通文件。
from pathlib import Path
from zipfile import ZIP_DEFLATED, ZipFile
root = Path("docs").resolve(strict=True)
output = Path("docs.zip").resolve()
if not root.is_dir() or output.is_relative_to(root):
raise ValueError("需要有效的源目录,输出应在源目录之外")
with ZipFile(output, "x", compression=ZIP_DEFLATED) as bundle:
for path in sorted(root.rglob("*")):
if path.is_file() and not path.is_symlink():
bundle.write(path, arcname=path.relative_to(root).as_posix())
示例要求 Python 3.9 及以上。x 模式会拒绝覆盖已有归档,空目录不会成为成员。
立即学习“Python免费学习笔记(深入)”;
准备相同文件名的子目录
用两个目录下的同名文件验证路径保留。
mkdir -p docs/a docs/b printf 'A\n' > docs/a/readme.txt printf 'B\n' > docs/b/readme.txt python pack.py
两个文件通过不同的成员路径区分,不会被扁平化成同一个名字。
查看打包结果
用标准库命令列出归档成员。
python -m zipfile -l docs.zip
预期看到 a/readme.txt 和 b/readme.txt。再次执行打包脚本应提示 docs.zip 已存在。


















