我想使用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实现这一点吗?
由于
答案 0 :(得分:6)
zip
格式没有任何简单的方法来删除或替换存档中的文件。可能有一些库可以就地完成,但我不知道。
但等等:
zip(1)完全可以做到这一点(使用“-u”选项)所以为什么不用python?
首先,所有-u
都告诉它“如果时间戳不是更新的话,只替换现有文件”,这在这里并不重要。如果没有-u
它仍然是,默认命令是add
,它在不检查时间戳的情况下执行相同的操作:
更新现有条目并添加新文件。如果存档不存在则创建它。这是默认模式。
但更重要的是,正如the manpage you referenced明确指出:
Zip文件。更改现有的zip存档时,zip会写入包含新内容的临时文件,只有在创建新版本的过程完成且没有错误时才替换旧文件。
这正是您想要做的:将一个完整的新文件写入临时位置,然后将原始文件替换为新文件。
如果您需要在Windows上运行它,这可能会有点痛苦。 (如果没有,请使用tempfile.NamedTemporaryFile
和os.rename
。)但您已经知道该怎么做了:
我知道编写完整新文件的方法,但如果内容很大,这将需要很长时间。
仅比zip -u
花费太多时间。
答案 1 :(得分:0)
我怀疑zipfile
模块可以像你想要的那样修改档案。如果可以的话,会有一种从ZipFile
删除文件的方法,但是没有。