将已被gzip压缩的数据写入文件
我有一个数据库,其中一些数据是二进制格式(在MySQL中是blob类型),这些数据实际上是从网页抓取的,并进行了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
你自己也说了:先提取数据,然后再把它写进一个gzip文件里。写“从gzipped数据中”并没有什么特别的地方:你只需要先解压gzip数据,得到原始数据,然后就像处理原始数据一样写入(因为它确实是原始数据)。文档里有详细说明这些操作。
不过,gzip只是一个压缩格式,并不是一个归档格式。它并不适合处理多个文件,所以你需要用其他方法把多个输入合成一个文件。通常的做法是先创建一个tar归档,然后再进行gzip压缩。在Python中,你可以使用tarfile
模块来做到这一点。因为你的数据是通过gzip解压流得到的,所以你需要使用TarFile.addfile(tarinfo, fileobj)
方法把它们添加到归档中。你可以把gzip.GzipFile
实例作为fileobj
来添加。