gpt4 book ai didi

python - 压缩编解码器如何在 Python 中工作?

转载 作者:太空狗 更新时间:2023-10-29 21:09:08 26 4
gpt4 key购买 nike

我正在查询数据库并使用 Python 存档结果,并且在将数据写入日志文件时尝试压缩数据。不过,我遇到了一些问题。

我的代码是这样的:

log_file = codecs.open(archive_file, 'w', 'bz2')
for id, f1, f2, f3 in cursor:
log_file.write('%s %s %s %s\n' % (id, f1 or 'NULL', f2 or 'NULL', f3))

但是,我的输出文件的大小为 1,409,780。对该文件运行 bunzip2 会生成一个大小为 943,634 的文件,然后对该文件运行 bzip2 会生成一个大小为 217,275 的文件。换句话说,未压缩的文件明显小于使用 Python 的 bzip 编解码器压缩的文件。 除了在命令行上运行 bzip2 之外,还有其他方法可以解决这个问题吗?

我尝试了 Python 的 gzip 编解码器(将行更改为 codecs.open(archive_file, 'a+', 'zip'))以查看它是否解决了问题。我仍然得到大文件,但当我尝试解压缩文件时,我也得到了 gzip: archive_file: not in gzip format 错误。 那里发生了什么?


编辑:我最初以附加模式而不是写入模式打开文件。虽然这可能是问题,也可能不是问题,但如果文件以“w”模式打开,问题仍然存在。

最佳答案

正如其他张贴者所指出的,问题在于 codecs库不使用增量编码器来编码数据;相反,它将提供给 write 方法的每个数据片段编码为压缩 block 。这是非常低效的,对于设计用于处理流的库来说只是一个糟糕的设计决策。

具有讽刺意味的是,Python 中已经内置了一个非常合理的增量 bz2 编码器。创建一个自动执行正确操作的“类文件”类并不难。

import bz2

class BZ2StreamEncoder(object):
def __init__(self, filename, mode):
self.log_file = open(filename, mode)
self.encoder = bz2.BZ2Compressor()

def write(self, data):
self.log_file.write(self.encoder.compress(data))

def flush(self):
self.log_file.write(self.encoder.flush())
self.log_file.flush()

def close(self):
self.flush()
self.log_file.close()

log_file = BZ2StreamEncoder(archive_file, 'ab')

注意:在这个例子中,我以追加模式打开文件; bunzip2 可以将多个压缩流附加到单个文件,但 Python 本身无法处理它(尽管有 is a patch 支持它)。如果您需要将创建的压缩文件读回 Python,请坚持每个文件一个流。

关于python - 压缩编解码器如何在 Python 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3824239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com