You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动