将gzip-already数据写入文件

时间:2011-06-12 10:01:11

标签: python unicode gzip

我有一个数据库,其中一些数据是二进制(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 

1 个答案:

答案 0 :(得分:0)

你自己说:解压缩,然后将它们写入gzip文件。编写“来自gzip压缩数据”并没有什么特别之处:你取消gzip数据以获取原始数据,然后将原始数据写成原始数据(因为它是)。文档向您展示了如何做这些事情。

但是,gzip只是一种压缩格式,而不是归档格式。它不是为处理多个文件而构建的,因此您必须使用其他内容从多个输入创建单个文件。通常,这是通过制作tar存档然后进行gzip压缩来完成的。您可以使用tarfile模块在​​Python中执行此操作。由于您的数据将来自gzip-decompression流,因此您需要使用TarFile.addfile(tarinfo, fileobj)方法将它们添加到存档中。您应该可以使用gzip.GzipFile实例作为fileobj添加此方式。