16

我有多个具有相同结构的 zip 文件——它们在根级别包含 XML 文件。每个 zip 文件中的所有文件都是唯一的(跨 zip 文件没有重复)。我需要将所有 zip 文件中的所有 XML 文件组合成一个 zip 文件(与原始 zip 文件具有相同的结构)。关于如何最好地做到这一点的建议?谢谢。

4

2 回答 2

13

这是我能想到的最短版本:

>>> import zipfile as z
>>> z1 = z.ZipFile('z1.zip', 'a')
>>> z2 = z.ZipFile('z2.zip', 'r')
>>> z1.namelist()
['a.xml', 'b.xml']
>>> z2.namelist()
['c.xml', 'd.xml']
>>> [z1.writestr(t[0], t[1].read()) for t in ((n, z2.open(n)) for n in z2.namelist())]
[None, None]
>>> z1.namelist()
['a.xml', 'b.xml', 'c.xml', 'd.xml']
>>> z1.close()

在不测试替代方案的情况下,对我来说这是最好的(可能也是最明显的!)解决方案,因为 - 假设两个 zip 文件包含相同数量的数据,这种方法只需要解压缩和重新压缩其中的一半(1 个文件) )。

PS:列表理解只是为了在控制台中的一行上保留指令(这可以加快调试速度)。好的 pythonic 代码需要一个适当的for循环,因为结果列表没有任何用途......

于 2012-05-13T01:30:55.320 回答
12

这就是我想出的,感谢@mac。请注意,当前实现的方式是修改第一个 zip 文件以包含其他 zip 文件中的所有文件。

import zipfile as z

zips = ['z1.zip', 'z2.zip', 'z3.zip']

"""
Open the first zip file as append and then read all
subsequent zip files and append to the first one
"""
with z.ZipFile(zips[0], 'a') as z1:
    for fname in zips[1:]:
        zf = z.ZipFile(fname, 'r')
        for n in zf.namelist():
            z1.writestr(n, zf.open(n).read())
于 2012-05-15T03:34:19.287 回答