【问题标题】:Read list of zlib archives阅读 zlib 档案列表
【发布时间】:2016-10-10 11:23:24
【问题描述】:

我有一个文件,它本身包含许多 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)

【问题讨论】:

  • 您似乎可以在 CMD+FLG 标记上拆分文件,尽管我不清楚是什么保护您免受压缩数据部分之一中包含的相同序列的影响。跨度>
  • 如何在不删除分隔符的情况下进行拆分?

标签: python file zlib


【解决方案1】:

你应该可以像这样使用一系列解压对象:

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属性判断字符串中是否还有未压缩的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多