【问题标题】:Unicode confusion #3423435Unicode 混淆 #3423435
【发布时间】:2018-02-24 13:30:34
【问题描述】:

我又一次进入了该死的 unicode-hell ... 叹息 =(

有两个文件:

$ 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 字符串?

【问题讨论】:

  • 请附上hexdumpkreise_tmp.geojsonpandas_tmp.csv。另请注意,按照规范,json 格式不能包含非 asci 符号。所以 json 可能包含相同的\xc3,但它会加载到ü。我猜你需要在打开文件时指定编码 - utf8,检查pd.read_csv是否包含编码参数,如果没有,你需要手动将bytes转换为utf8。
  • 什么版本的 Python?尝试升级到 Python 3.6。
  • @deathangel908 JSON 可以包含非 ASCII 符号就好了。 json.org - "任何 UNICODE 字符 ..."
  • 我会尝试在read_csv() 中指定encoding='utf-8'。我从未使用过 pandas,但如果你告诉它要使用的编码,它很有可能会将字节串解码为 un​​icode。
  • 每个文本文件(包括 JSON)都使用编写时使用的编码进行编码。您必须使用该编码阅读它。特定示例文本文件的当前内容可能是有效的,可以使用数百种编码中的许多进行解码。 file 将为您提供它所知道的可能性之一。如果您想知道文本文件的当前内容是否可以使用特定编码进行解码,您只需使用该编码读取它即可。但是,鉴于所需的 JSON 语法,JSON 使用三种易于区分的编码之一。否则,它不是有效的 JSON。

标签: unicode python-2.x python-unicode


【解决方案1】:

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 -*-

【讨论】:

  • 最后一位只是声明了源文件的编码。它对 JSON 或 pandas 的影响为零。它会影响源中的字符串常量。
【解决方案2】:

JSON 字符串始终是 Unicode。

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

但它们通常使用\u 转义序列化,因此file 只会看到ASCII。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多