【问题标题】:Merge multiple zip files into a single zip file in Python在 Python 中将多个 zip 文件合并为一个 zip 文件
【发布时间】:2012-05-13 00:28:46
【问题描述】:

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

【问题讨论】:

  • 把它们都拆开再做一个新的?
  • 这将是最明显的方法。您也可以选择一个作为最终的 zipfile,从其他文件中提取文件并将它们添加到最后一个,但不确定它会更快。
  • 谢谢@sarnold。我也在考虑这种方法,但不确定是否有更优雅的方法。
  • @jgritty,你的想法很有趣。我想我可以做一个测试,看看是否有任何性能改进。

标签: python zip


【解决方案1】:

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

>>> 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!

【讨论】:

  • 谢谢,虽然我会有不同数量的 zip 文件,所以我需要一个更通用的方法。
  • @DaveCrumbacher:除非我误解了你,否则使用这种方法合并多个文件所需要做的就是添加一个循环:for zfile in (z2, z3, z4, ...).... 或者我错过了什么?
【解决方案2】:

感谢@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())

【讨论】:

  • zipfile.ZipFile() 也是一个上下文管理器,因此您可以将 z1.close() 替换为 with z.ZipFile(zips[0], 'a') as z1: 并缩进后续代码。阅读对象也是如此。
  • 谢谢@glglgl。我已经更新了我的答案以反映这种方法。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2015-02-03
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多