Python zipfile模块extractall解压zip文件结果不一致如何解决
问题原因
两个压缩包的内部目录结构存在差异:
- test.zip 压缩时直接选中多个文件打包,压缩包根目录就是所有待压缩的文件
- airway.zip 压缩时选中了名为
Airway的父文件夹进行打包,压缩包根目录自带一层Airway文件夹,该结构和压缩包本身的文件名无关,所以重命名压缩包也不会改变解压结果。
解决方案
不要直接调用extractall方法,手动遍历压缩包内的文件,剥离最外层的根目录前缀,直接将文件写入目标路径,示例代码如下:
import zipfile import os file_path = '/something/airway.zip' dir_path = 'something/' with zipfile.ZipFile(file_path, "r") as zip_ref: for file_info in zip_ref.infolist(): # 跳过目录条目,只处理文件 if file_info.is_dir(): continue # 拆分文件路径,去掉最外层的根目录层级 path_segments = file_info.filename.split(os.sep) if len(path_segments) > 1: # 存在外层根目录,取后面的路径部分 relative_path = os.path.join(*path_segments[1:]) else: relative_path = file_info.filename # 拼接得到最终输出的绝对路径 target_file_path = os.path.join(dir_path, relative_path) # 自动创建目标路径的父目录,避免路径不存在报错 os.makedirs(os.path.dirname(target_file_path), exist_ok=True) # 写入文件内容 with zip_ref.open(file_info) as src, open(target_file_path, "wb") as dst: dst.write(src.read())
注意事项
- 代码会保留压缩包内部除最外层根目录外的所有子目录结构,不会打乱原有的文件嵌套关系
- 在Django项目中使用时,建议通过
settings.MEDIA_ROOT或settings.BASE_DIR构造目标路径,避免相对路径写错导致文件写入到项目目录外 - 生产环境使用建议增加路径合法性校验,确保最终生成的
target_file_path确实位于你指定的dir_path目录下,避免恶意构造的压缩包触发路径遍历漏洞。
内容的提问来源于stack exchange,提问作者Aman Sharma
相关产品推荐
相关产品推荐

