「for line in…」の結果、UnicodeDecodeError: 'utf-8'コーデックはバイトをデコードできません


214

これが私のコードです、

for line in open('u.item'):
#read each line

このコードを実行すると、次のエラーが発生します。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

これを解決してopen()にパラメーターを追加しようとすると、コードは次のようになります。

for line in open('u.item', encoding='utf-8'):
#read each line

ただし、同じエラーが発生します。それなら私は何をすべきか!助けてください。


3
正しくエンコードされていないデータだと思います。
Andreas Jung

9
または単にUTF-8データではありません。
Mark Tolonen 2013年


Python 2.7の代わりにPython 3を使用すると、msgpackでこのエラーが発生しました。私たちにとって、行動方針はpython 2.7で動作することでした。
ジェシーW.コリンズ

回答:


402

Mark Ransomによって提案されたように、私はその問題に適したエンコーディングを見つけました。エンコーディングは「ISO-8859-1」だったので、に置き換えるopen("u.item", encoding="utf-8")open('u.item', encoding = "ISO-8859-1")問題が解決します。


8
明示的は暗黙的よりも優れています(PEP 20)。
イオアニスフィリッピディス16

6
トリックは、ISO-8859-1またはLatin_1が8ビットの文字セットであるため、すべてのガベージに有効な値があることです。おそらく使用できませんが、無視したい場合は!
Kjeld Flarup

1
同じ問題が発生しましたUnicodeDecodeError: 'utf-8'コーデックは32番目のバイト0xd0をデコードできません:無効な継続バイトです。Python 3.6.5を使用してaws cliをインストールしました。そして、aws --versionを試したところ、このエラーで失敗しました。/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.pyを編集して、コードを次のdef read(self、filenames、encoding = "ISO-8859-1"に変更する必要がありました。 ):
ЕвгенийКоптюбенкоSep

3
エンコーディングを自動検出する方法はありますか?
OrangeSherbet

5
@OrangeSherbetを使用して検出を実装しましたchardet。ワンライナー(後import chardet)は次のとおりchardet.detect(open(in_file, 'rb').read())['encoding']です。詳細については、この回答を確認してください:stackoverflow.com/a/3323810/615422
VertigoRay

51

ISO 8859-1は、主に音声認識APIを使用している場合、私にとっても効果的です。

例:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
エラーメッセージの0xe9(é)から推測できるように、OPがISO 8859-1を読み取っていることは正しいかもしれませんが、ソリューションが機能する理由を説明する必要があります。音声認識APIへの参照は役に立ちません。
RolfBly 2017年

5
セミコロンとは何ですか?
右脚

29

ファイルには実際にはutf-8でエンコードされたデータは含まれていません。他のエンコードが含まれています。そのエンコーディングが何であるかを理解し、それをopen呼び出しで使用します。

たとえば、Windows-1252エンコーディングで0xe9は、は文字になりéます。


4
それで、どのようなエンコーディングであるかをどうやって見つけることができますか?私はLinuxを使用しています
SujitS 2013年

3
そこそれが常に機能することを実行する方法はありませんが、この質問への答えを参照してください。stackoverflow.com/questions/436220/...
RemcoGerlich

20

パンダを使ってこれを読んでみてください

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

パンダを提案している理由がわかりません。解決策は、ここで偶然見つけた正しいエンコーディングを設定することです。
Alastair McCormack

12

Python 2以下を使用している場合、解決策は次のとおりです。

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

encodingパラメータはでは機能しないためopen()、次のエラーが発生します。

TypeError: 'encoding'はこの関数の無効なキーワード引数です

1
しかし、これはバージョン3です
SujitS

1
そうだね。私はそれを使用している人々に役立つかもしれないと思ったPython 2
18:06にJeril

Python3でも私のために働いた
fenkerbb

2
あなたが覚えやすい何かをしたい場合は、'ISO-8859-1'としても知られています'latin-1''latin1'
Max Candocia 2018年

9

次の方法で問題を解決できます。

for line in open(your_file_path, 'rb'):

「rb」はバイナリモードでファイルを読み込んでいます。詳細はこちら。これが役立つことを願っています!



2

誰かがこれらを探している場合、これはPython 3でCSVファイルを変換する例です。

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

時にはときopen(filepath)ここでfilepath、実際にはないファイルが存在して開こうとしていることを確認ファイルを作成するので、まず、同じエラーが出るでしょう:

import os
assert os.path.isfile(filepath)

これがお役に立てば幸いです。


1

あなたはこの方法を試すことができます:

open('u.item', encoding='utf8', errors='ignore')

これは質問に対する答えを提供しません。批評したり、著者に説明を求めるには、投稿の下にコメントを残してください。- レビューから
MartenCatcher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.