【问题标题】:Python delete element from JSON causes unicode errorsPython 从 JSON 中删除元素会导致 unicode 错误
【发布时间】:2014-10-23 01:31:12
【问题描述】:

我有一个使用 import.io 从 Wikipedia 下载的美国县列表,但它为每个县生成了几个我想要从文档中删除的元素(例如 URL)。

我真的很困惑,因为我认为 JSON 文档是 Unicode 格式的,尽管我已经看到关于这个主题的类似问题/答案说只是弹出或删除元素。当我尝试弹出或删除时,我收到一条错误消息,提示您无法删除 unicode 并且 unicode 中没有弹出。我错过了什么?

JSON 文档中的示例条目

`
"data":[{"state/_text":["Alabama"],
"county":["http://en.wikipedia.org/wiki/Autauga_County,_Alabama"],
"state":["http://en.wikipedia.org/wiki/Alabama"],
"state/_source":["/wiki/Alabama"],
"state/_title":["Alabama"],
"county/_title":["Autauga County, Alabama"],
"county/_text":["Autauga County"],
"county/_source":["/wiki/Autauga_County,_Alabama"],`

我的代码:

`import json`

`countiesDoc = json.load(open("US_Counties.json"))
    for element in countiesDoc:
        del element["county"]`

`open("updated_US_Counties.json", "w").write(
    json.dumps(countiesDoc, sort_keys=true, indent=4, separators=(',', ': '))
)`

追溯:

`Traceback (most recent call last):
  File "edit_us_counties.py", line 10, in <module>
    del element["county"]
TypeError: 'unicode' object does not support item deletion`

`Process finished with exit code 1`

【问题讨论】:

  • 请发布minimal, complete, verifiable example:相关代码、该代码的输入以及运行时遇到的异常(带回溯)。
  • 这不是 MCVE。请阅读链接的帮助。你的代码应该是完整的——就像可运行的一样,包括任何需要的输入。并发布整个回溯,而不仅仅是其中的一行。
  • 对不起。我似乎找不到 json 文档的好例子。 Import.io 不断冻结,它输出的文档只是一个没有格式的连续文本文件。

标签: python json unicode


【解决方案1】:

countiesDoc 在加载后应该是 Python dict。遍历 dict 返回键,它们是字符串;因此,element 是一个字符串。示例:

import json

jstr = '''\
{
    "element":"value",
    "other":123
}
'''

doc = json.loads(jstr)
print('doc',type(doc))
for e in doc:
    print('e',e,type(e))

输出:

doc <class 'dict'>
e element <class 'str'>
e other <class 'str'>

我不知道您文档的格式,但假设 county 是键,您可能只需要以下内容:

del countiesDoc['county']

【讨论】:

    【解决方案2】:

    你混淆了一些东西。

    JSON 可以将各种事物(数字、布尔值、字符串、数组或上述任何一种的字典)编码为一个大字符串。

    服务器使用 JSON 将数组或字典编码为大字符串,然后通过网络将其发送到您的程序。然后您需要解码它以取回数组或字典(在 Python 术语中,listdict)。在你这样做之前,你所拥有的只是一个字符串。而且你不能从字符串中popdelete


    所以:

    import json
    
    j = <however you retrieve the JSON document>
    obj = json.loads(j)
    del obj['key_i_want_gone']
    

    当然,如果您想将修改后的字典发送回服务器,或将其写入文本文件或其他任何内容,您可能需要先将其重新编码为 JSON:

    j = json.dumps(obj)
    <however you save or upload or whatever a JSON document>
    

    您收到有关 Unicode 的错误消息的原因是在 Python 2.x 中,保存 Unicode 字符串的类型的名称是 unicode。因此,当您对该字符串调用pop 时,您是在尝试调用一个名为unicode.pop 的方法,而没有这样的方法。

    这基本上只是一个巧合,您用来获取文档的 API 为您提供了 Unicode 字符串,而 JSON 被定义为对 Unicode 字符串的编码,而 JSON 可以将 Unicode 字符串作为它可以编码的东西之一,等等。 (好吧,这不是巧合。大多数新的 API、文档格式等都使用 Unicode,因为它是能够处理人们关心的大多数语言中的大多数字符的最佳方式。但错误与是否或者 JSON 的字符串不是 Unicode 或其他不同的东西。)

    【讨论】:

    • 那么为什么会返回 unicode 错误? countiesDoc = json.load(open("US_Counties.json")) for element in countiesDoc: del element["county"]
    • @AutomaticStatic:我不知道您指的是什么“this”,或者您所说的“返回 unicode 错误”是什么意思。这就是为什么我要求你发布一个完整的例子。您问为什么“说 unicode 中没有弹出窗口”,我猜到您的代码和错误可能是什么样子,并解释了为什么会失败。我猜错了吗?还是解释得不够清楚?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2022-11-02
    • 1970-01-01
    • 2017-06-25
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多