是的,你没有任何漂亮的选择。时间用 _write_gzip_header 中的这一行写入:
write32u(self.fileobj, long(time.time()))
由于他们没有给你一种方法来覆盖时间,你可以做以下事情之一:
- 从 GzipFile 派生一个类,并将
_write_gzip_header
函数复制到派生类中,但在这一行中具有不同的值。
- 导入 gzip 模块后,将新代码分配给其时间成员。您实际上将在 gzip 代码中提供名称 time 的新定义,因此您可以更改 time.time() 的含义。
- 复制整个 gzip 模块,并将其命名为 my_stable_gzip,然后更改您需要的行。
- 将 CStringIO 对象作为 fileobj 传入,并在 gzip 完成后修改字节流。
- 编写一个伪造的文件对象,跟踪写入的字节,并将所有内容传递到真实文件,时间戳的字节除外,您自己编写。
这是选项#2(未经测试)的示例:
class FakeTime:
def time(self):
return 1225856967.109
import gzip
gzip.time = FakeTime()
# Now call gzip, it will think time doesn't change!
选项 #5 可能是最干净的,因为它不依赖于 gzip 模块的内部(未经测试):
class GzipTimeFixingFile:
def __init__(self, realfile):
self.realfile = realfile
self.pos = 0
def write(self, bytes):
if self.pos == 4 and len(bytes) == 4:
self.realfile.write("XYZY") # Fake time goes here.
else:
self.realfile.write(bytes)
self.pos += len(bytes)