[解決済み] Python 3に切り替えるとUnicodeDecodeErrorが発生する
質問
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データの読み書きの両方について説明しています。
関連
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python Decorator 練習問題
-
Python入門 openを使ったファイルの読み書きの方法
-
Python 入出力と高次代入の基礎知識
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない