2017-09-15 113 views
0

我再次進入那個該死的Unicode的地獄......嘆=(Unicode的混亂#3423435

有兩個文件:

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

我讀的第一個文件是這樣的:

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

我讀第二個文件是這樣的:

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

現在檢查出什麼是字符串內:

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

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

爲什麼從「UTF-8 Unicode文本」文件中的字符串只是正常的字符串,字符串從「ASCII文本」文件unicode字符串?

+0

請附上'kreise_tmp.geojson'和'pandas_tmp.csv'的'hexdump'。另請注意,按規範json格式不能包含非asci符號。所以json可能包含相同的'\ xc3',但它會加載到'ü'中。我想你需要在打開文件時指定編碼 - utf8,檢查'pd.read_csv'是否包含編碼參數,如果不需要手動將'bytes'轉換爲utf8。 – deathangel908

+0

什麼版本的Python?嘗試升級到Python 3.6。 –

+2

@ deathangel908 JSON可以包含非ASCII符號。 http://json.org/ - 「*任何UNICODE字符* ...」 – melpomene

回答

0

添加encoding='utf-8'到文件的開放給他們使用UTF-8

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

解碼,你也可以做同樣的用JSON

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

而且在Python 2.7,你可以添加此到文件頂部。

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

最後一點只是聲明瞭*源文件*的編碼。它對JSON或熊貓沒有影響。它影響源中的字符串常量。 –

2

JSON字符串始終是Unicode。

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

但他們往往與\u轉義序列,所以file將只能看到ASCII。

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