【发布时间】: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 块吗?