是的,你没有任何漂亮的选择。时间与该行写在_write_gzip_header:
write32u(self.fileobj, long(time.time()))
由于他们不给你一个方法,覆盖时间,你可以做这些事情之一:
- 派生从GzipFile中的一类,并将
_write_gzip_header
函数复制到您的派生类中,但在这一行中使用不同的值。
- 导入gzip模块后,为其时间成员分配新代码。您将基本上在gzip代码中提供名称时间的新定义,因此您可以更改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)
是的,我猜这个补丁早就被接受了!时光飞逝...... – zaphod 2016-03-20 05:02:22