web-dev-qa-db-fra.com

json.dump - UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0xbf en position 0: octet de début invalide

J'ai un dictionnaire data où j'ai stocké:

  • key - ID d'un événement

  • value - le nom de cet événement, où value est une chaîne UTF-8

Maintenant, je veux écrire cette carte dans un fichier json. J'ai essayé avec ça:

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

mais cela me donne l'erreur:

UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0xbf en position 0: octet de début invalide

Maintenant, j'ai aussi essayé avec:

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

mais cela soulève la même erreur:

UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0xbf en position 0: octet de début invalide

J'ai aussi essayé avec:

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

mais cela soulève l'erreur:

UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xbf en position 3114: l'ordinal n'est pas dans la plage (128)

Des suggestions sur la façon de résoudre ce problème?

EDIT: Je crois que c'est la ligne qui me pose le problème:

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

EDIT 2: La variable data est lue dans un fichier. Donc, après l'avoir lu dans un fichier:

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

Je fais ensuite:

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

Ce qui me donne l'erreur:

TypeError: doit être unicode, pas str

Ensuite, j'essaie de le faire avec le dictionnaire de données:

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

qui est, encore une fois, suivi par:

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

mais encore une fois, la même erreur:

TypeError: must be unicode, not str

J'obtiens la même erreur lorsque j'utilise la simple fonction open pour lire dans le fichier:

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

L'exception est causée par le contenu de votre dictionnaire data, au moins n des clés ou des valeurs est pas encodé en UTF-8.

Vous devrez remplacer cette valeur; soit en substituant une valeur qui est codée UTF-8, soit en la décodant en un objet unicode en décodant juste cette valeur avec le codage qui est le codage correct pour cette valeur:

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

pour décoder cette chaîne en tant que valeur codée en Latin-1 à la place.

15
Martijn Pieters