gpt4 book ai didi

python - simplejson:加载西类牙字符——utf-8

转载 作者:太空宇宙 更新时间:2023-11-04 10:49:08 25 4
gpt4 key购买 nike

我正在尝试使用 Python 的 simplejson 加载一些地理数据。

<!-- language: lang-py -->
string = file("prCounties.txt","r").read().decode('utf-8')
d = simplejson.loads(string)

文本文件有波浪号,单词应该是 Añasco 而不是 u"A\xf1asco" SimpleJson 没有解析。来源是geoJson file from github

{"type": "FeatureCollection", "properties": {"kind": "state", "state": "PR"}, "features": [[{"geometry": {"type": "MultiPolygon", "coordinates": [[[[-67.122, 18.3239], [-67.0508, 18.3075], [-67.0398, 18.291], [-67.0837, 18.2527], [-67.122, 18.2417], [-67.1603, 18.2746], [-67.1877, 18.2691], [-67.2261, 18.2965], [-67.1822, 18.3129], [-67.1275, 18.3184]]]]}, "type": "Feature", "properties": {"kind": "county", "name": u"A\xf1asco", "state": "PR"}}]]}

Python 给我错误 simplejson.decoder.JSONDecodeError: Expecting object


我用来从 GitHub 加载以生成 prCounties.txt 的脚本。变量 counties 是与相关 GEOjson 数据的位置相关的字符串列表。

很明显这不是保存这些数据的正确方法:

<!-- language: lang-py -->
countyGeo = [ ]

for x in counties:
d = simplejson.loads(urllib.urlopen("https://raw.github.com/johan/world.geo.json/master/countries/USA/PR/%s" % (x)).read())
countyGeo += [ d["features"][0]]
d["features"][0]=countyGeo
file("prCounties.txt", "w").write(str(d))

编辑:在最后一行中,我将str 替换为simplejson.dumps。我想它现在编码正确了。 文件(“prCounties.txt”,“w”).write(simplejson.dumps(d))

最佳答案

这里有两个问题。第一:

string = file("prCounties.txt","r").read().decode('utf-8')

你为什么要解码它? JSON 明确采用 UTF-8 字符串。这是 JSON 定义的一部分。 simplejson 可以处理 Unicode 字符串这一事实使其更易于使用,但它通过将它们编码回 UTF-8 来有效地处理它们,所以......为什么不一开始就保持这种状态?

更重要的是,您的数据从何而来?如果 prCounties.txt 中有 u"Añasco",则它不是 JSON。您不能仅仅因为它们看起来相似就将某些内容编码为一种标准并解码为完全不同的标准。

例如,如果您执行了 open('prCounties.txt', 'w').write(repr(my_dict)),则必须使用 Python 读回它repr 解析器(可能是 ast.literal_eval,或者你必须自己写一些东西)。

或者,如果您想将数据解析为 JSON,请首先将其写为 JSON。


根据您的评论,数据是从https://raw.github.com/johan/world.geo.json/master/countries/USA/PR读取的/Añasco.geo.json

该 URL 的原始内容是:

{"type":"FeatureCollection","properties":{"kind":"state","state":"PR"},"features":[
{"type":"Feature","properties":{"kind":"county","name":"Añasco","state":"PR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.1220,18.3239],[-67.0508,18.3075],[-67.0398,18.2910],[-67.0837,18.2527],[-67.1220,18.2417],[-67.1603,18.2746],[-67.1877,18.2691],[-67.2261,18.2965],[-67.1822,18.3129],[-67.1275,18.3184]]]]}}
]}

您会注意到没有 "name": u"Añasco"(或 "name": u"A\xf1asco" 或任何类似内容)那里。您只需调用 read 即可阅读此内容——无需从 UTF-8 或任何其他方式对其进行解码——只需将其传递给 simplejson.loads 即可正常工作:

$ curl -O https://raw.github.com/johan/world.geo.json/master/countries/USA/PR/Añasco.geo.json
$ cp Añasco.geo.json prCounties.txt
$ python
>>> import simplejson
>>> string = file("prCounties.txt","r").read()
>>> d = simplejson.loads(string)
>>> print d
{u'type': u'FeatureCollection', u'properties': {u'kind': u'state', u'state': u'PR'}, u'features': [{u'geometry': {u'type': u'MultiPolygon', u'coordinates': [[[[-67.122, 18.3239], [-67.0508, 18.3075], [-67.0398, 18.291], [-67.0837, 18.2527], [-67.122, 18.2417], [-67.1603, 18.2746], [-67.1877, 18.2691], [-67.2261, 18.2965], [-67.1822, 18.3129], [-67.1275, 18.3184]]]]}, u'type': u'Feature', u'properties': {u'kind': u'county', u'name': u'A\xf1asco', u'state': u'PR'}}]}

看,一点错误都没有。

在某个地方,您已对这些数据进行了一些处理,将其转换为其他非 JSON 格式的内容。我的猜测是,除了进行一堆不必要的额外 decodeencode 调用之外,您还进行了 simplejson.loads,然后尝试重新 simplejson.loads 您返回的 dictrepr。或者,您可能已经对充满已编码 JSON 字符串的 dict 进行了 JSON 编码。无论您做了什么,该代码,而不是您向我们展示的代码,都是错误所在。

最简单的修复可能是首先正确生成 prCounties.txt。这只是几行代码的 70 多次下载,可能需要 2 行 bash 或 4 行 Python 才能完成……

关于python - simplejson:加载西类牙字符——utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com