我有一个数据库,其中一些数据是二进制(MySQL中的blob数据类型),这实际上是网页报废和gzip压缩。现在我想提取它们并将每条记录写入一个gzip文件,我认为这是可行的 - 毕竟它们是gzip-data对吗?
但问题是,我该怎么做?通过搜索,我可以找到关于如何从原始数据编写gzip文件的一百万个示例,而不是gzip一个。将gzip压缩文件直接写入文件不会产生gzip文件,更不用说我有一些“序数不在范围内”的异常。
你能帮忙吗?提前致谢。我是Python的新手......编辑:这是我使用的方法:
def store_cache(self, content, news_id):
if not content:
return
# some of the records may contain normal data (not gzipp-ed), hence this try block
try:
content = self.gunzip(content)
except:
return
import gzip
with gzip.open('static/cache/%s' % (self.base36encode(news_id), ), 'wb') as f:
f.write(content)
f.close()
这会导致异常:
<type 'exceptions.UnicodeEncodeError'> at /migrate
'ascii' codec can't encode character u'\u1edb' in position 186: ordinal not in range(128)
这是最里面的追溯:
E:\Python27\lib\gzip.py in write
self.crc = zlib.crc32(data, self.crc) & 0xffffffffL
答案 0 :(得分:0)
你自己说:解压缩,然后将它们写入gzip文件。编写“来自gzip压缩数据”并没有什么特别之处:你取消gzip数据以获取原始数据,然后将原始数据写成原始数据(因为它是)。文档向您展示了如何做这些事情。
但是,gzip只是一种压缩格式,而不是归档格式。它不是为处理多个文件而构建的,因此您必须使用其他内容从多个输入创建单个文件。通常,这是通过制作tar存档然后进行gzip压缩来完成的。您可以使用tarfile
模块在Python中执行此操作。由于您的数据将来自gzip-decompression流,因此您需要使用TarFile.addfile(tarinfo, fileobj)
方法将它们添加到存档中。您应该可以使用gzip.GzipFile
实例作为fileobj
添加此方式。