web-dev-qa-db-ja.com

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

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です。

73
pie

Pythonはバイト配列(utf-8でエンコードされた文字列と見なされるbytes)をUnicode文字列(str)に変換しようとします。このプロセスは、もちろんutf-8の規則に従った復号化です。これを試みると、UTF-8でエンコードされた文字列では許可されていないバイトシーケンス(つまり、位置0の0xff)に遭遇します。

あなたが我々が見ることができる少しのコードも提供しなかったので、我々は残りについて推測することができるだけでした。

スタックトレースから、トリガアクションはファイルからの読み込み(contents = open(path).read())であると想定できます。私はこれを次のように書き直すことを提案します。

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

open()のモード指定子のbは、ファイルがバイナリとして扱われることを示しているので、contentsbytesのままになります。このようにして復号化の試みは行われません。

91
Alfe

この解決策を使用すると、文字が取り除かれ(無視され)、文字なしで文字列が返されます。あなたがそれらを変換しないでそれらを取り除くことであるならば、これを使用してください。

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

errors='ignore'を使うあなたはいくつかの文字を失うだけです。しかし、あなたがそれらを気にしないのであれば、それらは私のソケットサーバーに接続するクライアントの悪いフォーマットとプログラミングから生じる余分な文字のように思われます。それからそれは簡単な直接解決策です。 参照

37

これと同様の問題を抱えていた、デコードするために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形式で返されます。そこからそれはデコードされて行で区切られるでしょう。

16
tattmoney76

私が確認できるいくつかの調査をした後、同じエラーに苦しんでいるときに私はこのスレッドに出くわしました、これはあなたがUTF-8でUTF-16ファイルをデコードしようとするとき起こるエラーです。

_復号ヒントとして使用され、デコードされた文字列内の文字として表示されていない UTF-16第characther(UTF-16で2バイト)のバイトオーダーマーク(BOM)です 。これは、最初のバイトがFEかFFのどちらかで、2番目のバイトがもう一方のバイトであることを意味します。

私が本当の答えを見つけた後に大きく編集しました

11
Peter Ogden

使用のみ

base64.b64decode(a) 

の代わりに

base64.b64decode(a).decode('utf-8')

CSV details.csv ファイルを読み取り( r )、 utf8 でエンコードします。 if エラー 発生 無視 エラー、これは単に次のコードで行われます。

with open('details.csv', 'r',encoding="utf8", errors='ignore') as csvDataFile:
    csvReader = csv.DictReader(csvDataFile)
3
Hariharan AR

あなたがMacを使っているのなら、隠しファイルがないかどうか、.DS_Storeをチェックしてください。ファイルを削除した後、私のプログラムは働いた。

2
Juan Navarrete

この問題を解決するには、エンコード形式ISO-8859-1を使用します。

1

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

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

まずは、最初に "GoogleNews-vectors-negative300.bin.gz"ファイルをロードしてから、Ubuntuのこのコマンドでそれを展開してください。gunzip -k GoogleNews-vectors-negative300.bin.gz [手動で抽出することは決してお勧めできません]。次に、pyrhon 3でこれらのコマンドを適用する必要があります。

import gensim model = gensim.models.Word2Vec.load_Word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True) .それが役に立つことを願っています。

0
Maryam

シリアルポートからデータを受信して​​いる場合は、正しいボーデレート(および他の設定)を使用していることを確認してください。( utf-8 )を使用したデコード

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

linuxでシリアルポートの設定を確認するには:stty -F /dev/ttyUSBX -a

0
Saif Faidi