You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中ZipFile写入文件生成完整路径结构如何解决?

如何避免Python ZipFile打包时保留完整文件路径?

这个问题我之前踩过坑!你遇到的情况是因为zipfile.ZipFile.write()方法默认会把传入的文件完整绝对路径都添加到压缩包中,所以解压后就会还原出整个路径层级。咱们可以用这几个简单的方法解决:

方法1:指定arcname参数(最推荐)

write()方法的第二个参数arcname可以自定义文件在压缩包内的名称和路径。如果只想保留文件名,直接传入文件名即可:

import zipfile

zf = zipfile.ZipFile("/path/to/zipfile.zip", mode='w')
try:
    # 只在压缩包中保留文件名,丢弃原有路径
    zf.write("/path/to/original.file", arcname="original.file")
finally:
    zf.close()

如果你的文件路径是动态生成的,用os.path.basename()自动提取文件名会更灵活:

import zipfile
import os

target_file = "/path/to/original.file"
zf = zipfile.ZipFile("/path/to/zipfile.zip", mode='w')
try:
    # 自动获取文件名,无需手动硬编码
    zf.write(target_file, arcname=os.path.basename(target_file))
finally:
    zf.close()

甚至还能通过arcname自定义压缩包内的目录结构,比如把文件放到assets子目录下:

zf.write(target_file, arcname=f"assets/{os.path.basename(target_file)}")

方法2:切换工作目录后打包

先切换到目标文件所在的目录,再执行write(),这样方法会使用相对路径(也就是纯文件名)打包:

import zipfile
import os

target_file = "/path/to/original.file"
# 拆分文件的目录和文件名
file_dir = os.path.dirname(target_file)
file_name = os.path.basename(target_file)

zf = zipfile.ZipFile("/path/to/zipfile.zip", mode='w')
try:
    # 切换到文件所在目录
    original_dir = os.getcwd()
    os.chdir(file_dir)
    zf.write(file_name)
finally:
    # 恢复原来的工作目录,避免影响后续代码
    os.chdir(original_dir)
    zf.close()

如果你的Python版本是3.11+,可以用contextlib.chdir上下文管理器,更简洁安全:

import zipfile
import os
from contextlib import chdir

target_file = "/path/to/original.file"
file_dir = os.path.dirname(target_file)
file_name = os.path.basename(target_file)

zf = zipfile.ZipFile("/path/to/zipfile.zip", mode='w')
try:
    with chdir(file_dir):
        zf.write(file_name)
finally:
    zf.close()

这两种方法都能解决你遇到的路径嵌套问题,个人更推荐第一种,代码更简洁,也不需要处理工作目录的切换~

内容的提问来源于stack exchange,提问作者user7450368

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:16