【问题标题】:Write gzipped-already data into a file将已压缩的数据写入文件
【发布时间】:2011-09-13 08:42:54
【问题描述】:

我有一个数据库,其中一些数据是二进制的(MySQL 中的 blob 数据类型),这实际上是网页被废弃和 gzip 压缩的。现在我想提取它们并将每条记录写入一个 gzip 文件,我认为这是可行的 - 毕竟它们是 gzipped-data 对吗?

但是,问题是,我该怎么做?通过搜索,我可以找到一百万个关于如何从 original 数据编写 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 

【问题讨论】:

  • 为什么不发布保存文件并引发这些错误的代码?也许有人可以帮助您纠正它。
  • 将二进制数据(来自 MySQL blob)写入扩展名为 .gz 的文件是否有效?
  • 没有@Yannick,UnicodeEncodeError 一直出现。我尝试了编解码器、utf-8 编码/解码等...
  • 由于某种原因,您似乎正在从数据库中获取 unicode 字符串。您的 BLOB 实际上是数据库中的 TEXT 对象,您是否需要关闭 use_unicode 才能安全地取出它们?
  • 嗨 Yannick,实际上有些 blob 是 unicode 字符串(未压缩),但我不是已经将它们放入 try...except 块吗?

标签: python unicode gzip


【解决方案1】:

您自己说过:提取它们,然后将它们写入 gzip 文件。写“从压缩数据”并没有什么特别之处:你解压缩数据以获取原始数据,然后像原始数据一样写入原始数据(因为它是)。该文档向您展示了如何执行这些操作。

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

【讨论】:

  • 谢谢大家的回答。让我(重新)尝试一下 Karl 的建议:解压缩 gzip 压缩的内容并将其写入 gzip 文件。实际上每条记录一个文件,所以我不需要tarfile 模块。会及时通知您结果。
  • 好的,我编辑了我的问题以包括我的最后一次尝试,你们能再帮忙吗?
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多