2016-10-10 153 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'標記,儘管我不清楚什麼保護你免受包含在一個壓縮數據部分中的相同序列的影響。 –

+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壓縮文件並解壓縮每一個單獨的文件與「_decompressed.n」附加到原始文件名稱。

關鍵是要使用解壓縮對象的unused_data屬性來確定字符串中是否存在任何未壓縮的數據。

+0

哇,這個作品!謝謝! – Yukarin