Python的zipfile模块无法更新条目

时间:2013-02-19 22:10:05

标签: python zipfile

我想使用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实现这一点吗?

由于

2 个答案:

答案 0 :(得分:6)

zip格式没有任何简单的方法来删除或替换存档中的文件。可能有一些库可以就地完成,但我不知道。

但等等:

  

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

首先,所有-u都告诉它“如果时间戳不是更新的话,只替换现有文件”,这在这里并不重要。如果没有-u它仍然是,默认命令是add,它在不检查时间戳的情况下执行相同的操作:

  

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

但更重要的是,正如the manpage you referenced明确指出:

  

Zip文件。更改现有的zip存档时,zip会写入包含新内容的临时文件,只有在创建新版本的过程完成且没有错误时才替换旧文件。

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

如果您需要在Windows上运行它,这可能会有点痛苦。 (如果没有,请使用tempfile.NamedTemporaryFileos.rename。)但您已经知道该怎么做了:

  

我知道编写完整新文件的方法,但如果内容很大,这将需要很长时间。

仅比zip -u花费太多时间。

答案 1 :(得分:0)

我怀疑zipfile模块可以像你想要的那样修改档案。如果可以的话,会有一种从ZipFile删除文件的方法,但是没有。