使用Python压缩文件夹时如何避免包含多余上级目录?
Python压缩文件夹时移除多余目录的解决方法
用zipfile压缩单个文件的代码可以正常运行:
with zipfile.ZipFile("jam.zip", "w") as zippy: zippy.write('custard.txt')
但压缩文件夹时,原代码生成的压缩包会多一层多余的temp目录:
import os import zipfile myfolder = "D:\\temp\\myfolder" thefiles = os.listdir(myfolder) with zipfile.ZipFile("jam.zip", "w") as zippy: for file in thefiles: file_path = os.path.join(myfolder, file) zippy.write(file_path)
生成的压缩包结构:
jam.zip └── temp └── myfolder └── custard.txt
想要改成的目标结构:
jam.zip └── myfolder └── custard.txt
解决思路
问题出在zippy.write()默认会把文件的完整系统路径存入压缩包,所以带上了temp层级。只需用arcname参数指定压缩包内的路径,就能自定义目录结构。
方法一:支持遍历子目录的完整写法
如果目标文件夹里有子目录,用os.walk遍历更全面:
import os import zipfile myfolder = "D:\\temp\\myfolder" with zipfile.ZipFile("jam.zip", "w") as zippy: # 遍历目标文件夹下的所有文件和子目录 for root, dirs, files in os.walk(myfolder): for file in files: file_path = os.path.join(root, file) # 计算文件相对于myfolder父目录的路径,作为压缩包内的路径 arcname = os.path.relpath(file_path, os.path.dirname(myfolder)) zippy.write(file_path, arcname=arcname)
方法二:仅遍历一级文件的简化写法
如果目标文件夹里只有一级文件,直接修改原代码即可:
import os import zipfile myfolder = "D:\\temp\\myfolder" thefiles = os.listdir(myfolder) with zipfile.ZipFile("jam.zip", "w") as zippy: for file in thefiles: file_path = os.path.join(myfolder, file) # 指定压缩包内的路径为myfolder/文件名 arcname = os.path.join(os.path.basename(myfolder), file) zippy.write(file_path, arcname=arcname)
两种方法都能让压缩包只保留myfolder作为根目录,去掉多余的temp层级。
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

