2017-09-15 3 views
0

Encore une fois j'entre ce putain unicode-enfer ... sigh = (Unicode confusion # 3423435

Il y a deux fichiers:

$ file * 
kreise_tmp.geojson:  ASCII text 
pandas_tmp.csv:   UTF-8 Unicode text 

J'ai lu le premier fichier comme ceci:

with open('kreise_tmp.geojson') as f: 
jdata = json.loads(f.read()) 

J'ai lu le deuxième fichier comme ceci:

pandas_data = pd.read_csv(r'pandas_tmp.csv', sep=";") 

maintenant vérifier ce qui est dans les cordes:

>>> jdata['features'][0]['properties']['name'] 
u'Kreis Euskirchen' # a unicode string? 

>>> pandas_data['kreis'][0] 
'Kreis D\xc3\xbcren' # not a unicode string? 

Pourquoi les chaînes du « texte Unicode UTF-8 » fichier seulement des chaînes normales et les chaînes de la chaînes unicode de fichiers « texte ASCII »?

+0

Veuillez joindre 'hexdump' de' kreise_tmp.geojson' et 'pandas_tmp.csv'. Notez également que, par spécification, le format json ne peut pas contenir de symboles non asci. Donc json contient probablement le même '\ xc3' mais il se charge dans' ü'. Je suppose que vous devez spécifier l'encodage - utf8 lors de l'ouverture du fichier, vérifiez si 'pd.read_csv' contient un paramètre d'encodage, si vous n'avez pas besoin de convertir manuellement' bytes' en utf8. – deathangel908

+0

Quelle version de Python? Essayez de mettre à jour vers Python 3.6. –

+2

@ deathangel908 JSON peut contenir des symboles non-ASCII très bien. http://json.org/ - "* Tout caractère UNICODE * ..." – melpomene

Répondre

0

ajouter encoding='utf-8' à l'ouverture des fichiers pour les décoder avec utf-8

pandas_data = pd.read_csv(r'pandas_tmp.csv', sep=";", encoding='utf8') 

vous pouvez également faire la même chose avec le JSON

with open('kreise_tmp.geojson', encoding='utf8') as f: 
    jdata = json.loads(f.read()) 

également en Python 2.7, vous pouvez ajouter cette en haut du fichier ..

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
+1

Ce dernier bit déclare simplement l'encodage du * fichier source *. Il n'a aucun effet sur JSON ou sur les pandas. Cela affecte les constantes de chaîne dans la source. –

2

Les chaînes JSON sont toujours Unicode.

~$ python2 
>>> import json 
>>> json.loads('"\xc3\xbc"') 
u'\xfc' 

Mais ils sont souvent sérialisés avec \u échappe, si file ne fera que voir ASCII.

>>> json.dumps(_) 
'"\\u00fc"'