web-dev-qa-db-ja.com

pythonのgzipファイルからutf-8文字を読み取る

pythonのgunzipファイル(.gz)を読み込もうとしていますが、問題が発生しています。

Gzipモジュールを使用して読み取りましたが、ファイルはutf-8テキストファイルとしてエンコードされているため、最終的に無効な文字を読み取り、クラッシュします。

Utf-8ファイルとしてエンコードされたgzipファイルを読み取る方法を知っている人はいますか?役立つコーデックモジュールがあることは知っていますが、その使用方法がわかりません。

ありがとう!

import string
import gzip
import codecs

f = gzip.open('file.gz','r')

engines = {}
line = f.readline()
while line:
    parsed = string.split(line, u'\u0001')

    #do some things...

    line = f.readline()
for en in engines:
  print(en)
26
Juan Besa

なぜこんなに難しいのかわかりません。

あなたは正確に何をしていますか? 「最終的に無効な文字を読み取る」と説明してください。

それは次のように単純でなければなりません:

import gzip
fp = gzip.open('foo.gz')
contents = fp.read() # contents now has the uncompressed bytes of foo.gz
fp.close()
u_str = contents.decode('utf-8') # u_str is now a unicode string

編集済み

この回答は、Python2Python3で機能します。@ SeppoEnarviの回答を参照してください https://stackoverflow.com/a/19794943/610569rtモードを使用します) gzip.openの場合。

21
sjbrown

これはPython 3.3:

import gzip
gzip.open('file.gz', 'rt', encoding='utf-8')

Gzip.open()では、テキストモード( 't')を明示的に指定する必要があることに注意してください。

35
Seppo Enarvi

多分

import codecs
zf = gzip.open(fname, 'rb')
reader = codecs.getreader("utf-8")
contents = reader( zf )
for line in contents:
    pass
21
Jochen Ritzel

上記は大量のデコードエラーを引き起こしました。私はこれを使用しました:

for line in io.TextIOWrapper(io.BufferedReader(gzip.open(filePath)), encoding='utf8', errors='ignore'):
    ...
5
Yurik

Python形式(2.5以上)

from __future__ import with_statement # for 2.5, does nothing in 2.6
from gzip import open as gzopen

with gzopen('foo.gz') as gzfile:
    for line in gzfile:
      print line.decode('utf-8')
0
Douglas Mayle