2016-10-10 97 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