Python用shutil/zipfile解压Zip文件遇FileNotFoundError求助
问题原因与解决办法
原因分析
- 这是Python标准库
zipfile模块在Windows环境下的路径兼容性问题:Windows文件系统会自动忽略文件夹名称末尾的空格,但Python的zipfile/shutil在解析Zip包内的路径时,会严格保留原路径的末尾空格,导致创建文件夹时尝试生成带末尾空格的路径,而Windows实际不允许这种命名规则,最终抛出FileNotFoundError。 - 尽管CPython仓库标注相关问题已修复,但该修复未回溯到3.11.1版本,或是你的场景触发了修复未覆盖的边缘情况。
解决办法
临时手动修复方案
直接通过zipfile.ZipFile遍历所有文件条目,手动去除路径末尾的空格后再执行解压:
import zipfile import os def extract_zip_fix(zip_path, target_dir): with zipfile.ZipFile(zip_path, 'r') as zf: for info in zf.infolist(): # 修正路径:移除文件夹/文件名末尾的空格 fixed_path = os.path.normpath(info.filename).rstrip() # 处理文件夹:先创建无末尾空格的目录 if info.is_dir(): os.makedirs(os.path.join(target_dir, fixed_path), exist_ok=True) continue # 解压文件到修正后的路径 with open(os.path.join(target_dir, fixed_path), 'wb') as f: f.write(zf.read(info.filename)) # 调用示例 extract_zip_fix("待解压文件.zip", "./解压目标目录")
长期解决方案
- 升级Python版本:将Python升级到3.11.4及以上版本,官方在后续小版本中完善了Windows路径末尾空格的处理逻辑,升级后
shutil.unpack_archive和zipfile.ZipFile.extractall可正常工作。 - 使用第三方库:若无法升级Python,可使用
patool库(需先执行pip install patool安装),它会调用系统原生解压工具,自动适配Windows的路径规则:
import patoolib patoolib.extract("待解压文件.zip", outdir="./解压目标目录")
内容的提问来源于stack exchange,提问作者TaihouKai
相关产品推荐
相关产品推荐

