同じ構造を持つ複数のzipファイルがあります。これらのファイルには、ルートレベルのXMLファイルが含まれています。各zipファイル内のすべてのファイルは一意です(zipファイル全体で重複しません)。私は、すべてのzipファイルのすべてのXMLファイルを(元のzipファイルと同じ構造の)単一のzipファイルに結合する必要があります。これを行うにはどのように最善を尽くすための提案?ありがとう。複数のzipファイルをPythonの単一のzipファイルにマージする
答えて
これは、私が思い付くことができ、最短バージョンである:私にはこれがベストです、選択肢をテストすることなく
>>> 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行に指示を保存するだけです(デバッグのスピードを上げます)。良いpythonicコードは、結果のリストは目的を果たさないので、適切なfor
ループを必要とするでしょう...
HTH!
ありがとう、私はさまざまな数のzipファイルを持っていますが、私はもっと一般的なアプローチが必要です。 –
@DaveCrumbacher:私が誤解していない限り、複数のファイルをマージするためにこの手法を使用するには、ループを追加するだけです: 'for zfile in(z2、z3、z4、...)' ...私は何かを逃していますか? – mac
はい、@mac、あなたは正しいです。ありがとう。 –
ここで私が思いついたのは、@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()'を 'z.ZipFile(zips [0]、 'a')でz1:後続のコード。読み込みオブジェクトと同じです。 – glglgl
ありがとう@glglgl。私はこのアプローチを反映するために私の答えを更新しました。 –
- 1. 複数のzipファイルへのphp zipファイル
- 2. Python - 複数のzipファイルのファイル管理と処理
- 3. Java ZIPファイルZipファイルをコピーして別のZipファイルにコピーする
- 4. ZIPファイルのpythonモジュールバイトサイズ違い
- 5. Zipファイル内のファイル数をカウントする#
- 6. PythonでZipファイルが一部のSVGファイルを圧縮しない
- 7. iOSのzipファイルに複数のドキュメントを追加するには?
- 8. PHPのZipファイル
- 9. PythonのZipファイルにファイルのようなオブジェクトを追加する
- 10. Pythonで有効なzipファイル
- 11. zip.jsで複数のファイルをzipに追加するには?
- 12. 複数のイメージファイルのzipファイルを作成する方法
- 13. utf-8ファイル名のZipファイル
- 14. python 2.7 zipファイルで作業する
- 15. 複数のファイルとZIPをダウンロードする - Chrome拡張子
- 16. Pythonでzipファイル内のファイルをメモリに渡さずに
- 17. Objective-Cのでzipファイルに
- 18. ZIPファイルにファイルを追加する
- 19. グローバル.zipファイル
- 20. python zipファイルはスレッドセーフですか?
- 21. Pythonで大きなzipファイルをダウンロード
- 22. .zipファイルを作成する
- 23. httpリクエストのzipファイルのコンテンツタイプ
- 24. 単一ファイルの再マージ
- 25. 親ファイルのzipファイルへの添付
- 26. zipファイル/フォルダのサードパーティ製コンポーネント
- 27. 問題:mvcのzipファイル
- 28. Zip/Jarファイルのバイナリ差分
- 29. zipファイル内のフォルダパスを削除する方法。zipファイル内のtxtファイルのみが必要です
- 30. PHP:cURLやZipを使わずに複数のファイルをダウンロードするには?
これらをすべて解凍して新しいものを作成しますか? – sarnold
これは最も明白なアプローチです。最終的なzipファイルとして1つを選択し、他のファイルからファイルを抽出して最終的なファイルに追加することもできますが、もっと速くなるかどうかはわかりません。 – jgritty
@sarnoldありがとうございます。私もこの考え方を考えていましたが、それをよりエレガントにする方法があるかどうかは分かりませんでした。 –