openpyxl写入Excel文件时的非确定性行为原因咨询
openpyxl写入Excel文件时的非确定性行为原因咨询
这个问题我之前也碰到过,一开始特别纳闷——明明生成的DataFrame完全一样,怎么每次导出的Excel文件哈希值和大小都变,CSV却稳得一批?后来研究了下openpyxl的工作机制和XLSX格式的本质,终于搞懂了原因:
首先得明确一个关键点:XLSX格式本质上是个ZIP压缩包,你可以把后缀改成.zip解压看看,里面是一堆XML文件和元数据文件;而CSV就是纯文本,只有你的数据内容,没有任何额外信息。
导致Excel文件哈希变化的核心原因有两个:
- 自动生成的时间戳元数据:openpyxl在写入Excel时,会自动往文件里添加或更新时间相关的元数据,比如文件的创建时间、修改时间,还有内部XML文件里的
<dcterms:created>、<dcterms:modified>这类字段。每次运行脚本的时间不一样,这些值就会跟着变,哪怕你的DataFrame数据半分没动。 - ZIP包的内部细微差异:ZIP压缩包的生成过程中,文件的存储顺序、压缩时的临时标记,或者openpyxl内部写入时的缓存信息,都可能让最终的ZIP包出现细微的结构差异。这些差异完全不影响Excel文件的实际内容,但会改变整个文件的哈希值。
而CSV就没这些幺蛾子,它是纯文本格式,写入的内容完全由DataFrame的数据决定,只要数据固定,生成的文本内容就100%一致,哈希值自然不会变。
你可以自己验证一下:把两次生成的xlsx文件改成zip后缀,解压后对比里面的docProps/core.xml文件,就能看到时间戳的明显差异;再看数据相关的xl/worksheets/sheet1.xml,内容肯定是完全一样的。
备注:内容来源于stack exchange,提问作者d4tm4x
相关产品推荐
相关产品推荐

