2016-10-10 7 views
-2

多くのzlibアーカイブが入っているファイルがあります。ファイルの 構造は次のようになります。zlibアーカイブのリストを読む

+-------------------------+ 
|+-----------------------+| 
||  CMF+FLG (78DA) || 
|+-----------------------+| 
|+-----------------------+| 
||...compressed data 1...|| 
|+-----------------------+| 
|+-----------------------+| 
||  ADLER32  || 
|+-----------------------+| 
| 
|+-----------------------+| 
||  CMF+FLG (78DA) || 
|+-----------------------+| 
|+-----------------------+| 
||...compressed data 2...|| 
|+-----------------------+| 
|+-----------------------+| 
||  ADLER32  || 
|+-----------------------+| 
| 
|+-----------------------+| 
||  CMF+FLG (78DA) || 
|+-----------------------+| 
|+-----------------------+| 
||...compressed data 3...|| 
|+-----------------------+| 
|+-----------------------+| 
||  ADLER32  || 
|+-----------------------+| 
|       | 
|.........................| 
|       | 
|+-----------------------+| 
||  CMF+FLG (78DA) || 
|+-----------------------+| 
|+-----------------------+| 
||...compressed data n...|| 
|+-----------------------+| 
|+-----------------------+| 
||  ADLER32  || 
|+-----------------------+| 
+-------------------------+ 

そして、私はこれらすべてのアーカイブを反復処理し、それらを抽出する必要があります。 私は次のコードを試しましたが、これはファイルから最初のアーカイブのみを抽出します。

for filename in sys.argv[1:]: 
    with open(filename, 'r') as compressed: 
     with open(filename + '-decompressed', 'w') as expanded: 
      data = zlib.decompress(compressed.read()) 
      expanded.write(data) 
+0

「CMD + FLG」マーカーでファイルを分割するように見えますが、圧縮されたデータセクションの1つに含まれる同じシーケンスからあなたを守るのはわかりません。 –

+0

デリミタを削除せずに分割する方法は? – Yukarin

答えて

2

あなたは、このような減圧一連のオブジェクトを使用することができるはずです。

import zlib 

with open(filename, 'rb') as compressed: 
    data = compressed.read() 
    file_no = 0 

    while data: 
     d = zlib.decompressobj() 
     with open('{}_decompressed.{}'.format(filename, file_no), 'wb') as f: 
      f.write(d.decompress(data)) 
     data = d.unused_data 
     file_no += 1 

これは、複数の連結zlibの圧縮ファイルを含む単一のファイルを取得し、で別のファイルにそれぞれ1を解凍します"_decompressed.n"が元のファイル名に追加されました。

キーは、解凍オブジェクトのunused_data属性を使用して、文字列に圧縮されていないデータが残っているかどうかを判断することです。

+0

うわー、これは動作します!ありがとう! – Yukarin

関連する問題