【问题标题】:Repeatably gzip files in python在python中重复gzip文件
【发布时间】:2012-12-22 11:15:29
【问题描述】:

我正在用 python 编写一个脚本,用于将静态站点部署到 aws(s3、cloudfront、route53)。因为我不想在每次部署时都上传每个文件,所以我通过比较它们的 md5 散列和它们的电子标签(s3 设置为对象的 md5 散列)来检查哪些文件被修改。这适用于所有文件,除了我的构建脚本在上传之前 gzip 压缩的文件。查看文件内部,gzip 似乎并不是真正的纯函数;每次运行 gzip 时输出文件都会有非常细微的差异,即使源文件没有更改。

我的问题是:有没有办法让 gzip 在给定完全相同的输入的情况下可靠且可重复地输出完全相同的文件?还是我最好只检查文件是否已压缩、解压缩并计算 md5 哈希/手动设置电子标签值?

【问题讨论】:

  • gzip 实际上对于完全相同的输入是稳定的。你确定没有改变吗?可能包含的存档元数据已更改(例如每次生成文件时将“修改”设置为“现在”)?
  • 绝对有可能只是元数据问题,因为相同的字节总是不同的。即便如此,有什么好的方法可以解决这个问题吗?只是让我的构建脚本将最后修改设置为某个常量?

标签: python gzip


【解决方案1】:

每次压缩的数据都是一样的。唯一不同的可能是标头中的修改时间。 GzipFile 的第五个参数(如果您正在使用的话)允许您在标头中指定修改时间。第一个参数是文件名,它也包含在标题中,因此您希望保持相同。如果为源数据提供第四个参数,则第一个参数仅用于填充标题的文件名部分。

【讨论】:

  • 照你说的做,并将GzipFile 构造函数中的mtime 设置为一个常量,就像一个魅力!
【解决方案2】:

gzip 不稳定,因为你猜对了:

[root@dev1 ~]# touch a b
[root@dev1 ~]# gzip a
[root@dev1 ~]# gzip b
[root@dev1 ~]# md5sum a.gz b.gz
8674e28eab49306b519ec7cd30128a5c  a.gz
4974585cf2e85113f1464dc9ea45c793  b.gz

【讨论】:

  • 两个文件都有不同的元数据(ab 是元数据中包含的文件名)。使用gzip -c 创建一个不替换旧文件的新文件,然后重复该过程而不更改输入文件。测试那个输出,你会发现输出是稳定的。
猜你喜欢
  • 2011-12-30
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2015-02-03
相关资源
最近更新 更多