同じ構造の zip ファイルが複数あります。これらのファイルには、ルート レベルに XML ファイルが含まれています。各 zip ファイル内のすべてのファイルは一意です (zip ファイル間で重複はありません)。すべての zip ファイルのすべての XML ファイルを 1 つの zip ファイル (元の zip ファイルと同じ構造) に結合する必要があります。これを行う最善の方法についての提案はありますか? ありがとう。
9846 次
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: リスト内包表記は、コンソールの 1 行に命令を保持するためのものです (これにより、デバッグが高速化されます)。for
結果のリストが何の役にも立たないことを考えると、良いpythonicコードには適切なループが必要です...
チッ!
于 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 に答える