在Python中将多个zip文件合并为一个zip文件

时间:2012-05-13 00:28:46

标签: python zip

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

2 个答案:

答案 0 :(得分:11)

这是我能提出的最短版本:

>>> 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循环,因为结果列表没有用处...

HTH!

答案 1 :(得分:8)

这是我想出来的,感谢@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())