使用Python zipfile压缩文件时缺失CRC值的原因
为啥你的zipfile脚本生成的归档缺CRC值?
嘿,我来帮你捋捋这个问题!看了你的代码片段,结合zipfile模块的常见坑,大概率是这几个原因导致的:
最可能的原因:归档没正确关闭
你代码里没看到zf.close()的调用,也没用with上下文管理器。ZipFile对象如果没被正确关闭,归档的元数据(包括CRC值这种校验信息)就没法完整写入到文件里。
修复办法:强烈用with语句,它会自动帮你处理关闭逻辑,不用手动记着调用close:
with zipfile.ZipFile("myzip.zip", 'w') as zf: # 把你的循环写入逻辑都放在这个代码块里
压缩参数没写全或写错了
你代码里的compress_...明显没写完,应该是compress_type参数。虽然默认的ZIP_STORED(仅存储不压缩)模式也应该有CRC,但如果参数缺失或者写错,可能会导致元数据写入异常。如果要压缩的话,记得明确指定:
zf.write(file_path, arcname=f, compress_type=zipfile.ZIP_DEFLATED)
路径处理可能出问题了
你手动替换路径分隔符又拆分拼接,容易搞出路径错误,比如实际写入的文件根本不存在或者内容为空?如果文件内容是空的,CRC值自然没法正确计算。建议用os.path.basename()直接拿文件名,比手动拆分靠谱多了。
给你一个修复后的完整示例
import os.path import zipfile from glob import glob def dozip(): file_list = glob("C:/python27/scripts/*.py") # 用with自动管理归档文件的打开/关闭 with zipfile.ZipFile("myzip.zip", 'w', zipfile.ZIP_DEFLATED) as zf: for f in file_list: # 处理路径分隔符,适配Windows系统 local_path = f.replace("/", os.sep) if os.path.exists(local_path): # 直接拿文件名作为归档里的名称 arcname = os.path.basename(local_path) print(f"正在添加文件: {local_path} -> {arcname}") zf.write(local_path, arcname) if __name__ == "__main__": dozip()
这样改完之后,生成的zip归档应该就能正常包含CRC值了~
内容的提问来源于stack exchange,提问作者Texdarkstar




