4

Python2とPython3の両方で機能する(おそらくgzipで圧縮された)テキストファイルを開くコードを書いています。

通常のテキストファイル(圧縮されていない)のみがある場合は、次のことができます。

import io
for line in io.open(file_name, encoding='some_encoding'):
    pass

デコードを気にしない場合(Python 2/3で文字列/バイトを使用)

if file_name.endswith('.gz'):
    file_obj = gzip.open(file_name)
else:
    file_obj = open(file_name)

for line in file_obj:
    pass

どうすればこれらの両方のケースをスムーズに処理できますか?言い換えれば、デコードをgzip.open()とスムーズに統合する方法は?

4

1 に答える 1

1

私はこれを簡単にテストしました、そしてそれは正しいことをするようです。ファイル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.gzgzip

更新 ええ、それはばかげています、ストリームはそもそも間違った方法です。

テストファイル

ö
ä
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

于 2012-09-19T10:33:12.927 に答える