【问题标题】:Forcing a specific timestamp for files in pythons zipfile强制 python zipfile 中文件的特定时间戳
【发布时间】:2012-06-20 07:55:30
【问题描述】:

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

类似的东西:

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

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

【问题讨论】:

    标签: python zipfile


    【解决方案1】:

    查看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)
    

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

    【讨论】:

    • +1 两个 zip 文件的哈希值相同的问题,其中一个是通过重新压缩另一个的内容创建的,我花了 2 个小时,但我没有找到解决方案。你的回答就是我的问题的解决方案。谢谢。
    • @sema 这也正是我的用例。我需要能够创建可重现的 ZIP,这样当从具有相同内容的文件创建时,ZIP 存档将是逐位相同的。很高兴我能帮助别人。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2011-02-03
    相关资源
    最近更新 更多