Pythonテキストの読み取りによくある符号化の問題


冒頭
私达がちょうど大量のテキストのデータを処理することを学ぶことを始める时、いつもデータのこの1枚を読み取って壳が现れて、特に私のこのようにまったく指导の白がなくて、千里の行は第1歩を踏み出したばかりで终わりを宣言して、このような情况は往々にして私达が自分で登って取ったいくつかのネットのテキストに现れて、普通はTXTファイルです.次に、このような問題を具体的にどのように解決するかを見てみましょう.
テキストデータの読み込み
ここでは主にテキストの読み取りについて話しますが、バイナリファイルの読み取りについてはあまり言及しません.まず、通常の状況では、テキストデータをどのように読み取るかを見てみましょう.
# Read the entire file as a single string
with open('somefile.txt', 'rt') as f:
    data = f.read()
    # Iterate over the lines of the file
with open('somefile.txt', 'rt') as f:
    for line in f:
    # process line
...

ほとんどの人がテキスト処理に触れ始めたとき、最初に思いついた処理方法だと思いますが、実際に私たちが読んだテキストにはASCII、UTF-8、GBK、UTF-16符号化など、いろいろな形式の符号化があります.上のコードはデフォルトでシステムの符号化を呼び出して、あなたが読み取る必要があるテキストデータを読み出します.
In [1]: import sys

In [2]: sys.getdefaultencoding() 
Out[2]: 'utf-8'

上記のコードを使用して、システムのデフォルトの符号化形式が何であるかを確認することができます.ここでは、私たちの長い間のGBK符号化、つまりwindowsシステムのデフォルトの符号化を指摘しなければなりません.直接読むとデータが読めないことが多いので、符号化環境はlinuxやmacの下で、不要な面倒を避けたほうがいいとアドバイスしています.もちろん、マイクロソフトのシステムは簡単に放棄することはできないので、符号化の問題に遭遇したとき、このテキストの符号化形式を事前に知っていれば、対応する符号化形式で読み取ることができ、読み取りの問題もなくなります.
with open('somefile.txt', 'rt', encoding='latin-1') as f:
    ...

Windowsでutf-8のテキストを読み込むときは、このようなコードを使ってencoding=「utf-8」をスムーズに読み取ることができます.
Pythonは非常に多くのテキスト符号化をサポートしています.いくつかの一般的な符号化はascii,latin−1,utf−8およびutf−16である.Webアプリケーションでは通常UTF-8が使用されます.asciiは、U+0000からU+007 Fまでの7ビット文字に対応する.latin-1は、バイト0-255~U+0000~U+00 FFのUnicode文字の直接マッピングである.
次に、リードテキスト符号化エラーの例を示します.
>>> f = open('sample.txt', 'rt', encoding='ascii')
>>> f.read()
    Traceback (most recent call last):
    File "", line 1, in 
    File "/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
    12: ordinal not in range(128)
>>>

私たちが知らないテキストが何をコードしているのか分からないとき、私たちはどうすればいいのでしょうか.一つ一つ試してみると頼りになる方法のようですが、もし1つのテキストが複数のテキストコード方式を採用していたら、どのように設定してもコードできない文字があるので、気まずいです.この時私たちはそうすべきです.
>>> # Replace bad chars with Unicode U+fffd replacement char
>>> f = open('sample.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Spicy Jalape?o!'
>>> # Ignore bad chars entirely
>>> g = open('sample.txt', 'rt', encoding='ascii', errors='ignore')
>>> g.read()
'Spicy Jalapeo!'
>>>

誤りを無視するのは治標の方法だが、毎回このように処理するのはまずい.このときのアドバイスは2つありますが、デフォルトutf-8符号化が望ましいです.もう1つは、未知の符号化されたテキストを読み取るときにlatin-1符号化を使用して復号エラーが発生しないことです.latin-1符号化を使用して1つのファイルを読み込む場合、完全に正しいテキスト復号データを生成できないかもしれませんが、そこから十分な有用なデータを抽出することもできます.また、後でデータを書き戻せば、元のデータは残ります.
OK、よくあるテキスト読み取りの問題はこれです.