エラーUnicodeDecodeError: 'utf-8'コーデックは位置0のバイト0xffをデコードできません:無効な開始バイト


162

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

上記サイトで「process.py」のコンパイル時にエラーが発生しました。

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

トレースバック(最新の呼び出しが最後):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

エラーの原因は何ですか?Pythonのバージョンは3.5.2です。

回答:


194

Pythonはバイト配列(bytesutf-8でエンコードされた文字列であると想定)をUnicode文字列(str)に変換しようとします。もちろん、このプロセスはutf-8ルールに従ったデコードです。これを試行すると、utf-8でエンコードされた文字列(つまり、位置0のこの0xff)では許可されていないバイトシーケンスが発生します。

あなたが見ることができるコードを提供しなかったので、私たちは残りを推測することができるだけでした。

スタックトレースから、トリガーアクションがファイルからの読み取りであったと想定できます(contents = open(path).read())。私はこれを次のような方法で再コーディングすることを提案します:

with open(path, 'rb') as f:
  contents = f.read()

これbは、open()ファイルがバイナリとして扱われるべきであるという状態のモード指定子の中で、のcontentsままbytesです。この方法ではデコードは行われません。


「ValueError:モード文字列は、 'br'ではなく 'r'、 'w'、 'a'、または 'U'のいずれかで始まる必要があります」
Unnikrishnan

3
@Unnikrishnan OK、次に使用しますrb(順序は重要ではないと思いましたが、少なくとも一部のシステム/バージョンではそうです)。私はそれに応じて私の答えを変更しました。
Alfe 2017

57
byte 0xff in position 0ファイルがUTF-16でエンコードされていることを意味する場合もありますが、with open(path, encoding='utf-16') as f:代わりにそれを行うことができます
Nikolai R Kristiansen

実際の0xff位置に文字がない場合はどうなり0ますか?そして、それはUTF-8エンコードされています。
Iulian Onofrei

純粋な'\xFF'文字はUTF-8でとしてエンコードされ'\xC3\xBF'ます。UTF-8は、2つの文字を使用して、MSBが設定されたすべての文字をエンコードします。(printf "\xff" | iconv -f latin1 -t utf-8 | xxdシェルでの出力を参照してください。)'\xFF'UTF-8エンコードされた文字列の先頭にある逐語的表現は、エンコードエラーです(UTF-8に関しては構文エラーと呼ばれることもあります)。
Alfe

83

このソリューションを使用すると、文字が取り除かれ(無視され)、文字なしで文字列が返されます。変換するのではなく削除する必要がある場合にのみ使用してください。

with open(path, encoding="utf8", errors='ignore') as f:

errors='ignore' あなたを使用すると、いくつかの文字が失われます。しかし、あなたがそれらを気にしない場合、それらは私のソケットサーバーに接続しているクライアントの不適切なフォーマットとプログラミングに起因する余分な文字であるように見えます。次に、それは簡単な直接的な解決策です。 参照


6
decode()でも動作します:contents = contents.decode('utf-8', 'ignore')ソース:docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
最良の答えになるはずです
ステイサム

私のユースケースでの最良の解決策:)
maestromusica

「一部の文字を失う」と言うとき、エラーのあるファイルは読み取られないということですか?または、そのファイルのすべてのコンテンツが読み取られるわけではありませんか?
msoutopico

@msoutopicoエラーを無視しているため、一部のエンコーディングが読み取られず、問題が発生しています。しかし、読んでいる間にスキップされたコンテンツに出くわしたことはありません。したがって、基本的にはエンコードの問題は無視されます。
Nitish Kumar Pal

23

これと同様の問題があり、UTF-16を使用してデコードしてしまいました。私のコードは以下です。

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

これはファイルの内容をインポートとして受け取りますが、コードをUTF形式で返します。そこからデコードされ、行で区切られます。


10
Pythonの3では、あなたは、符号化のparamを使用してこれを簡素化することができますwith open(path, encoding='utf-16') as f
ニコライRクリスチャンセンを

@NikolaiRKristiansen私はあなたの方法を試してみましたが、エラーが発生しましたTypeError: an integer is required (got type str)。どうして?どちらのファイルもバイナリで、として読み取られrbます。
ボゴタ

1
@Bogota encodingparamはテキストを読み取るときにのみ意味があります。mode引数から「b」を削除して、再試行してください。詳細については、ドキュメントをご覧ください:docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen


15

同じエラーが発生したときにこのスレッドに遭遇しました。確認した調査の結果、これはUTF-8でUTF-16ファイルをデコードしようとしたときに発生するエラーです。

UTF-16では、最初の文字(UTF-16では2バイト)はByte Order Mark(BOM)であり、デコードのヒントとして使用され、デコードされた文字列では文字として表示されません。つまり、最初のバイトはFEまたはFFのいずれかであり、2番目のバイトはもう1つです。

本当の答えを見つけた後、かなり編集されました


これで2時間の頭痛が終わりました!open( 'filename'、 'r')をf:としてファイルを開いてから、その内容を印刷すると、UTF-8が表示されますが、これは誤りです。
nulldroid


3

Macを使用している場合は、隠しファイル、.DS_Storeがないかどうかを確認してください。ファイルを削除した後、私のプログラムは動作しました。


1

読み込むファイルのパスを確認してください。パス名を現在の作業ディレクトリに変更するまで、コードでエラーが発生し続けました。エラーは:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

シリアルポートからデータを受信して​​いる場合は、正しいボーレート(および他の構成)を使用していることを確認してください:(utf-8)を使用してデコードしますが、構成が間違っていると同じエラーが発生します

UnicodeDecodeError: 'utf-8'コーデックは位置0のバイト0xffをデコードできません:無効な開始バイト

Linuxでシリアルポートの設定を確認するには、次のコマンドを使用します。 stty -F /dev/ttyUSBX -a


1

それは単に、ファイルを読み取るために間違ったエンコーディングを選択したことを意味します。

Macでは、を使用file -I file.txtして正しいエンコーディングを見つけます。Linuxでは、を使用しますfile -i file.txt


0

Linuxから生成されたファイルを処理するときにも同じ問題があります。疑問符を含むファイルに関連していたことがわかりました。


-1

同様の問題がありました。

それを解決する:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

しかし、別の問題がありました。一部のhtmlファイル(私の場合)はutf-8ではなかったため、同様のエラーを受け取りました。これらのhtmlファイルを除外すると、すべてがスムーズに機能しました。

そのため、コードを修正することを除いて、読み込んでいるファイルも確認してください。実際に互換性がない可能性があります。


-4

可能であれば、テキストエディターでファイルを開き、エンコーディングをUTF-8に変更してみてください。それ以外の場合は、OSレベルでプログラム的に実行します。


-4

同様の問題があります。tensorflow / models / objective_detectionで例を実行しようとすると、同じメッセージが表示されました。Python3をPython2に変更してみてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.