web-dev-qa-db-ja.com

json.dump-UnicodeDecodeError: 'utf8'コーデックは位置0のバイト0xbfをデコードできません:無効な開始バイト

私が保存した辞書dataを持っています:

  • key-イベントのID

  • value-このイベントの名前。valueはUTF-8文字列です

次に、このマップをjsonファイルに書き留めます。私はこれを試しました:

with open('events_map.json', 'w') as out_file:
    json.dump(data, out_file, indent = 4)

しかし、これは私にエラーを与えます:

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

今、私も試しました:

with io.open('events_map.json', 'w', encoding='utf-8') as out_file:
   out_file.write(unicode(json.dumps(data, encoding="utf-8")))

しかし、これは同じエラーを発生させます:

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

私も試しました:

with io.open('events_map.json', 'w', encoding='utf-8') as out_file:
    out_file.write(unicode(json.dumps(data, encoding="utf-8", ensure_ascii=False)))

しかし、これはエラーを発生させます:

UnicodeDecodeError: 'ascii'コーデックは、位置3114のバイト0xbfをデコードできません:順序が範囲外(128)

この問題を解決する方法についての提案はありますか?

編集:私はこれが私に問題を引き起こしている行であると信じています:

> data['142']
'\xbf/ANCT25'

編集2:data変数はファイルから読み取られます。だから、ファイルからそれを読んだ後:

data_file_lines = io.open(file_name, 'r', encoding='utf8').readlines()

私はそれから:

with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
        json.dump(data, json_file, ensure_ascii=False)

これは私にエラーを与えます:

TypeError:strではなくunicodeである必要があります

次に、データディクショナリでこれを実行しようとします。

for Tuple in sorted_tuples (the `data` variable is initialized by a Tuple):
    data[str(Tuple[1])] = json.dumps(Tuple[0], ensure_ascii=False, encoding='utf8')

再び、次が続きます:

with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
    json.dump(data, json_file, ensure_ascii=False)

しかし、再び、同じエラー:

TypeError: must be unicode, not str

ファイルからの読み取りに単純なopen関数を使用すると、同じエラーが発生します。

data_file_lines = open(file_name, "r").readlines()
11
Belphegor

例外はdata辞書の内容が原因です。少なくともoneのキーまたは値はnot UTF-8でエンコードされています。

この値を置き換える必要があります。 is UTF-8でエンコードされた値を代入するか、その値に対して正しいエンコードであるエンコードでその値のみをデコードすることにより、unicodeオブジェクトにデコードします。

data['142'] = data['142'].decode('latin-1')

代わりにその文字列をLatin-1でエンコードされた値としてデコードします。

15
Martijn Pieters