1. ホーム
  2. python

[解決済み] Python 3に切り替えるとUnicodeDecodeErrorが発生する

2022-02-18 22:40:21

質問

SublimeにPython3インタプリタを追加したところ、以下のコードが動作しなくなりました。

for directory in directoryList:
    fileList = os.listdir(directory)
    for filename in fileList:
        filename = os.path.join(directory, filename)
        currentFile = open(filename, 'rt')
        for line in currentFile:               ##Here comes the exception.
            currentLine = line.split(' ')
            for word in currentLine:
                if word.lower() not in bigBagOfWords:
                    bigBagOfWords.append(word.lower())
        currentFile.close()

次のような例外が発生します。

  File "/Users/Kuba/Desktop/DictionaryCreator.py", line 11, in <module>
    for line in currentFile:
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 305: ordinal not in range(128)

私の知る限り、Python3はどこでもutf-8をサポートしているはずなので、これはかなり奇妙なことだと思いました。しかも、全く同じコードがPython2.7では問題なく動きます。私は、環境変数 PYTHONIOENCODING しかし、OS X Mavericksでは環境変数を追加するのはそう簡単ではないようです。/etc/launchd.confを修正しました)

解決方法は?

Python 3 デコード テキストファイルを読み込む際に エンコード 書き込み時に デフォルトのエンコーディングは locale.getpreferredencoding(False) を返しますが、明らかに 'ASCII' . 参照 open() 機能説明 :

テキストモードでは、もし エンコーディング を指定しない場合、使用されるエンコーディングはプラットフォームに依存します。 locale.getpreferredencoding(False) が呼ばれ、現在のロケールエンコーディングを取得します。

システムの設定に依存するのではなく、明示的なコーデックを使用してテキストファイルを開く必要があります。

currentFile = open(filename, 'rt', encoding='latin1')

を設定するところ。 encoding パラメータは、読み込んでいるファイルに合わせてください。

Python 3 は、UTF-8 をデフォルトでサポートしています。 ソースコード .

書き込み可能なテキストファイルに書き込む場合も同様で、書き込まれたデータはエンコードされており、システムのエンコードに依存すると、以下のような問題が発生します。 UnicodeEncodingError の例外が発生します。書き込み時にどのコーデックを使用するかは、書き込むテキストと、その後にそのファイルをどうするかによって決まります。

Python 3 と Unicode については ユニコードHOWTO ソースコードのエンコーディングと、Unicodeデータの読み書きの両方について説明しています。