2017-09-15 1 views
0

Wieder einmal gebe ich, dass goddamn Unicode-Hölle ... seufz = (Unicode Verwirrung # 3423435

Es gibt zwei Dateien:

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

las ich die erste Datei wie folgt aus:

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

las ich die zweite Datei wie folgt:

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

nun prüfen, was in den Saiten ist:

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

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

Warum sind die Strings aus der "UTF-8 Unicode Text" Datei nur normale Strings und die Saiten von dem "ASCII-Text" Datei Unicode-Strings?

+0

Bitte 'hexdump' von' kreise_tmp.geojson' und 'pandas_tmp.csv' anhängen. Beachten Sie auch, dass das json-Format nach der Spezifikation keine asci-Symbole enthalten kann. So enthält Json wahrscheinlich das gleiche '\ xc3', aber es lädt in' ü'. Ich denke, Sie müssen Codierung angeben - utf8 beim Öffnen der Datei, überprüfen Sie, ob 'pd.read_csv' Codierung Param enthält, wenn es nicht manuell Byte in utf8 konvertieren müssen. – deathangel908

+0

Welche Version von Python? Versuchen Sie, auf Python 3.6 zu aktualisieren. –

+2

@ deathangel908 JSON kann Nicht-ASCII-Symbole enthalten. http://json.org/ - "* Any UNICODE character * ..." – melpomene

Antwort

0

hinzufügen encoding='utf-8' zum Öffnen von Dateien sie mit utf-8 zu dekodieren

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

Sie auch das gleiche zu tun mit dem JSON

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

auch in Python 2.7, können Sie dies hinzufügen an die Spitze der Datei.

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

Das letzte Bit deklariert nur die Codierung der * Quelldatei *. Es hat keine Auswirkungen auf JSON oder Pandas. Es wirkt sich auf String-Konstanten in der Quelle aus. –

2

JSON-Zeichenfolgen sind immer Unicode.

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

Aber sie sind oft mit \u entkommt serialisiert, siehe file wird so nur ASCII.

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