强制将文件的时间戳设置为特定时间戳在Python的zipfile中

16

在将文件添加到zip文件时,是否有可能强制使用特定的时间戳?

类似以下操作:

with ZipFile('spam.zip', 'w') as myzip:
  myzip.write('eggs.txt', date_time=(1752, 9, 9, 15, 0, 0))

我能否更改zipfile成员的ZipInfo?

1个回答

11

查看CPython 3.7中ZipFile.write()的源代码,该方法总是通过检查磁盘上的文件来获取其ZipInfo,包括一些元数据,如修改时间和特定于操作系统的属性(请参见ZipInfo.from_file()源代码)。

因此,要解决这个限制,您需要在写入文件时提供自己的ZipInfo - 这意味着使用ZipFile.writestr()并为其提供一个ZipInfo和从磁盘读取的文件数据,如下所示:

from zipfile import ZipFile, ZipInfo
with ZipFile('spam.zip', 'w') as myzip, open('eggs.txt') as txt_to_write:
    info = ZipInfo(filename='eggs.txt',
                   # Note that dates prior to 1 January 1980 are not supported
                   date_time=(1980, 1, 1, 0, 0, 0))
    myzip.writestr(info, txt_to_write.read())

或者,如果您仅想修改ZipInfo的日期,您可以从ZipInfo.from_file()获取它并重置其date_time字段:

info = ZipInfo.from_file('eggs.txt')
info.date_time = (1980, 1, 1, 0, 0, 0)

在一般情况下,这样做更好,因为您仍然希望保留特殊的操作系统属性。

3
+1 两个zip文件具有相同的哈希值的问题,其中一个是通过重新压缩另一个文件的内容创建的,这让我花了2个小时,但我没有找到解决方案。您的答案是我的问题的解决方案。谢谢。 - sema
1
@sema 这正是我的使用情况。我需要能够创建可重现的ZIP文件,使得当从具有相同内容的文件创建ZIP存档时,ZIP存档将完全相同。很高兴我能帮助其他人。 :) - s3cur3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接