Json.dump - UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0xbf в позиции 0: недопустимый стартовый байт

У меня есть словарь data, где я записал:

  • key - идентификатор события

  • value - имя этого события, где value - строка UTF-8

Теперь я хочу записать эту карту в json файл. Я пробовал с этим:

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

но это дает мне ошибку:

UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0xbf в позиции 0: недопустимый стартовый байт

Теперь я также пробовал:

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' не может декодировать байт 0xbf в позиции 0: недопустимый стартовый байт

Я также пробовал:

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 не может декодировать байт 0xbf в позиции 3114: порядковый номер не в диапазоне (128)

Любые предложения о том, как я могу решить эту проблему?

EDIT: Я считаю, что это линия, которая вызывает у меня проблему:

> 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: должен быть unicode, а не str

Затем я пытаюсь сделать это с помощью словаря данных:

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()

Ответ 1

Исключение вызвано содержимым вашего словаря data, хотя бы один из ключей или значений не кодируется в кодировке UTF-8.

Вам нужно будет заменить это значение; либо путем подстановки значения, кодируемого UTF-8, либо путем декодирования его на объект unicode путем декодирования именно этого значения с помощью любой кодировки, соответствующей кодировке для этого значения:

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

чтобы декодировать эту строку как значение, кодируемое латинским-1.