10

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

这些方面的东西:

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

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

4

1 回答 1

5

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

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

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)

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

于 2019-09-03T18:31:48.460 回答