将文件添加到zipfile时是否可以强制为其指定特定的时间戳?

遵循以下原则:

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

我可以更改zipfile成员上的ZipInfo吗?

最佳答案

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

因此,要解决此限制,您在写入文件时需要提供自己的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)

在通常情况下,您仍然希望保留特殊的OS属性,这样更好。

09-18 10:55