使用Python压缩指定文件生成的zip无法解压(操作不被允许)
解决Zip包无法解压(Error 1 - Operation not permitted)的问题
看起来你的问题核心出在条件判断的大小写不匹配,导致没有符合条件的文件被添加到zip包中,生成了空压缩包,而部分解压工具对空zip包会抛出"Operation not permitted"这类误导性错误。我们一步步来排查和解决:
1. 核心问题:文件名匹配的大小写冲突
你的代码里用file.title().split('_')[0]提取文件名前缀,再和rep = ['1', '2', 'new']做匹配。但str.title()会把每个单词的首字母大写,比如:
- 如果文件名是
new_report.txt,file.title()会变成New_Report.Txt,分割后得到的前缀是New,而你的rep数组里是小写的new,自然匹配不上。 - 最终没有任何文件被写入zip包,生成的空压缩包触发了解压工具的异常提示。
修复方案:统一大小写判断
把前缀转成小写(或者把rep里的元素统一成大写),确保匹配不受大小写影响,同时用with语句自动管理zip文件的关闭,避免手动close的潜在问题:
import zipfile import os def zip_files(report_dir): rep = ['1', '2', 'new'] print('RRREP ', rep) with zipfile.ZipFile('report.zip', 'w', zipfile.ZIP_STORED) as zipf: for root, dirs, files in os.walk(report_dir): for file in files: # 直接分割前缀并转小写,避免title()带来的大小写干扰 title = file.split('_')[0].lower() if title in rep: file_path = os.path.join(root, file) print(f"Adding file to zip: {file_path}") zipf.write(file_path) zip_files('.') # 传入明确的当前目录路径,避免空字符串的歧义
2. 其他可能的排查方向
如果上面的修复没解决问题,你可以检查以下几点:
- 确认有符合条件的文件:在
if title in rep分支里添加打印语句,确认确实有文件被选中并写入zip包。如果没有输出,说明你的匹配逻辑还有问题(比如文件名的分割符不是_)。 - 更换压缩模式:尝试把
zipfile.ZIP_STORED(无压缩存储)改成zipfile.ZIP_DEFLATED(压缩模式),部分系统对无压缩的特殊文件兼容性更好。 - 检查文件权限:确保你要打包的文件有可读权限,如果是系统保护文件或无读取权限的文件,写入zip包时可能会留下损坏条目,导致解压报错。
内容的提问来源于stack exchange,提问作者Julia Aleksandrova
相关产品推荐
相关产品推荐

