我对此进行了简要测试,它似乎做了正确的事情。你可以提供一个文件 obj 到gzip.GzipFile
和到io.open
所以
import io
import gzip
f_obj = open('file.gz','r')
io_obj = io.open(f_obj.fileno(), encoding='UTF-8')
gzip_obj = gzip.GzipFile(fileobj=io_obj, mode='r')
gzip_obj.read()
这给了我一个UnicodeDecodeError
因为我正在阅读的文件实际上不是 UTF-8,所以它似乎在做正确的事情。
出于某种原因,如果我使用直接io.open
打开表示该文件不是压缩文件。file.gz
gzip
更新
是的,这很愚蠢,流是错误的开始方式。
测试文件
ö
ä
u
y
以下代码使用定义的编解码器对压缩文件进行解码
import codecs
import gzip
gz_fh = gzip.open('file.gz')
ascii = codecs.getreader('ASCII')
utf8 = codecs.getreader('UTF-8')
ascii_fh = ascii(gz_fh)
utf8_fh = utf8(gz_fh)
ascii_fh.readlines()
-> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
utf8_fh.readlines()
-> [u'\xf6\n', u'\xe4\n', u'u\n', u'y']
需要一个流,codecs.StreamReader
因此您应该能够将压缩或未压缩的文件传递给它。
http://docs.python.org/library/codecs.html#codecs