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