如何避免Python zipfile模块归档多文件时生成冗余目录?
解决Python zipfile多文件归档时生成冗余目录的问题
你观察到的这个现象其实是zipfile.ZipFile.write()方法的默认路径处理逻辑导致的,我来拆解一下原因和解决办法:
为什么会出现这种差异?
- 当仅归档单个文件(且文件在当前工作目录下),
write()默认会把纯文件名作为归档内的存储路径,所以解压后直接得到该文件; - 但归档多个文件时,如果你传入的是带相对路径的文件名(比如从子目录里选取文件),
write()会完整保留这个相对路径,导致解压后生成对应的目录结构——这就是你说的“冗余目录”。
怎么解决冗余目录问题?
核心是通过write()方法的第二个参数arcname,手动指定文件在归档内的存储路径/名称,去掉多余的路径前缀。
举两个常见场景的例子:
场景1:批量归档子目录下的文件
假设你的目标文件都在test子目录里,错误写法会保留目录结构:
import zipfile import os # 错误写法:解压后会生成test目录 with zipfile.ZipFile("test.zip", "w") as zip_obj: for filename in os.listdir("test"): file_path = os.path.join("test", filename) zip_obj.write(file_path) # 这里会把test/filename作为归档路径
改成正确写法,用arcname指定归档后的文件名:
import zipfile import os # 正确写法:所有文件直接放在zip根目录 with zipfile.ZipFile("test.zip", "w") as zip_obj: for filename in os.listdir("test"): file_path = os.path.join("test", filename) zip_obj.write(file_path, arcname=filename) # 只保留文件名
场景2:手动添加多个当前目录的文件
如果你的文件都在当前工作目录下,只要确保传入write()的是纯文件名,就不会生成目录:
import zipfile # 直接添加多个文件,解压后无冗余目录 with zipfile.ZipFile("test.zip", "w") as zip_obj: zip_obj.write("test.txt") zip_obj.write("demo.txt") zip_obj.write("data.csv")
总结
只要控制好arcname参数,就能完全自定义归档内的目录结构,避免生成不必要的冗余目录。
内容的提问来源于stack exchange,提问作者Blaszard
相关产品推荐
相关产品推荐

