2017-09-15 129 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"'