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
相关产品推荐
相关产品推荐

