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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:48:02