4

我想使用 pythons zipfile模块更新 zip 文件中的条目。我的问题是这会生成一个新条目。

请假设我有这个代码:

from zipfile import ZipFile,ZIP_DEFLATED
with ZipFile("myfile.zip","w") as z:
    z.writestr("hello.txt", "the content of hello.txt", ZIP_DEFLATED)
    ###  how to update the hello.txt file here ?
    z.writestr("hello.txt", "the content of hello.txt", ZIP_DEFLATED)

在此之后,实际的 zip 文件有两个条目而不是一个:

$ unzip -l myfile.zip 
Archive:  myfile.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       24  2013-02-19 22:48   hello.txt
       24  2013-02-19 22:48   hello.txt
---------                     -------
       48                     2 files
$ python --version
Python 3.3.0
$

我知道编写一个完整的新文件的方法,但是如果内容很大,这将花费很多时间。

zip(1)实用程序可以做到这一点(使用“-u”选项),那么为什么不使用 python 呢?有什么方法我仍然可以使用 python 实现这一点?

谢谢

4

2 回答 2

6

zip格式没有任何简单的方法可以删除或替换存档中的文件。可能有一些图书馆可以就地这样做,但我不知道有哪一个。

可是等等:

zip(1) 完全可以做到这一点(使用“-u”选项)那么为什么不是 python?

首先,-u所做的只是告诉它“仅在时间戳不是较新的情况下替换现有文件”,这在这里并不真正相关。如果没有-u它,默认命令是add,它会在不检查时间戳的情况下执行相同的操作:

更新现有条目并添加新文件。如果存档不存在,请创建它。这是默认模式。

但是,更重要的是,正如您明确引用的联机帮助页所说:

压缩文件。更改现有 zip 存档时,zip 将使用新内容写入一个临时文件,并且仅在创建新版本的过程完成且没有错误时替换旧文件。

这正是您想要做的:将一个完整的新文件写入临时位置,然后用新文件替换原始文件。

如果您需要使其在 Windows 上运行,这可能会有点痛苦。(如果没有,只需使用tempfile.NamedTemporaryFileand os.rename。)但是您已经知道如何做到这一点:

我知道编写一个完整的新文件的方法,但是如果内容很大,这将花费很多时间。

只不过zip -u需要太多时间而已。

于 2013-02-20T00:20:03.590 回答
0

我怀疑该zipfile模块可以根据需要修改档案。如果可以的话,将有一种方法可以从 a 中删除文件ZipFile,但没有。

于 2013-02-19T22:49:44.027 回答