【问题标题】:how to delete json object using python?如何使用python删除json对象?
【发布时间】:2013-10-12 15:11:36
【问题描述】:

我正在使用 python 删除和更新从用户提供的数据生成的 JSON 文件,因此只有少数项目应该存储在数据库中。我想从 JSON 文件中删除特定对象。

我的 JSON 文件是:

[
  {
      "ename": "mark",
      "url": "Lennon.com"
  },
  {
      "ename": "egg",
      "url": "Lennon.com"
  }
]

我想用enamemark删除JSON对象。

由于我是 python 新手,我试图通过将对象转换为 dict 来删除它,但它不起作用。还有其他方法吗? 我试过这个:

index=0
while index < len(data):
    next=index+1
    if(data[index]['ename']==data[next]['ename']):
        print "match found at"
        print "line %d and %d" %(next,next+1)
        del data[next]
    index +=1

【问题讨论】:

  • 你能告诉我们你试过的代码吗?
  • 当你运行这个时,你是否因为文件没有改变而出现问题?
  • with open('try.json') as json_data: data = json.load(json_data)

标签: python json


【解决方案1】:

这是一个完整的示例,加载 JSON 文件,移除目标对象,然后将更新后的 JSON 对象输出到文件。

#!/usr/bin/python                                                               

# Load the JSON module and use it to load your JSON file.                       
# I'm assuming that the JSON file contains a list of objects.                   
import json
obj  = json.load(open("file.json"))

# Iterate through the objects in the JSON and pop (remove)                      
# the obj once we find it.                                                      
for i in xrange(len(obj)):
    if obj[i]["ename"] == "mark":
        obj.pop(i)
        break

# Output the updated file with pretty JSON                                      
open("updated-file.json", "w").write(
    json.dumps(obj, sort_keys=True, indent=4, separators=(',', ': '))
)

主要的一点是,我们通过遍历加载列表中的对象来找到对象,然后在找到对象后将其从列表中弹出。如果您需要删除列表中的多个对象,那么您应该存储要删除的对象的索引,然后在到达for 循环的末尾后立即将它们全部删除(您不要'不想在迭代时修改列表)。

【讨论】:

  • 它不工作。当我运行它时,它并没有从列表中弹出标记
  • 嗯,我使用您的确切输入运行了该脚本,并且标记已被删除。该脚本正在输出到一个名为'updated-file.json' 的新文件,因此它不会更新原始文件。也许这就是发生了什么?
  • 我实际上粘贴了您的相同代码,但它仍然无法正常工作。它正在生成与以前相同的文件
  • 附带说明,请记住,您不能使用 for x in obj 迭代 obj,因为您正在修改 obj 本身。
  • 仅供参考:python 3 中不再存在 xrange。
【解决方案2】:

json 的正确方法是反序列化它,修改创建的对象,然后,如果需要,将它们序列化回 json。 为此,请使用the json module。简而言之,使用&lt;deserialized object&gt; = json.loads(&lt;some json string&gt;) 读取json 和&lt;json output&gt; = json.dumps(&lt;your object&gt;) 创建json 字符串。 在您的示例中,这将是:

import json
o = json.loads("""[
    {
        "ename": "mark",
        "url": "Lennon.com"
    },
    {
        "ename": "egg",
        "url": "Lennon.com"
    }
]""")
# kick out the unwanted item from the list
o = filter(lambda x: x['ename']!="mark", o)
output_string = json.dumps(o)

【讨论】:

    【解决方案3】:

    您的 json 文件包含在对象列表中,这些对象是 Python 中的字典。只需将列表替换为其中没有对象的新列表:

    import json
    
    with open('testdata.json', 'rb') as fp:
        jsondata = json.load(fp)
    
    jsondata = [obj for obj in jsondata if obj['ename'] != 'mark']
    
    print(json.dumps(jsondata, indent=4))
    

    【讨论】:

      【解决方案4】:

      您需要使用json 模块。我假设python2。试试这个:

      import json
      json_data = json.loads('<json_string>')
      
      for i in xrange(len(json_data)):
        if(json_data[i]["id"] == "mark"):
          del json_data[i]
          break
      

      【讨论】:

      • 如果字典在不同的位置怎么办?
      • @MartijnPieters 公平点。我已更新我的答案以进行线性搜索。
      • @user2511142 您必须需要解码 json。当您尝试解码 json 文本时遇到什么错误。
      • 如果我正在使用它,那么它显示 TypeError: file does not support item删除
      • @Nikhil 我更新了我尝试过的问题,如果我按照你的方式做,那么它也会显示 Traceback(最近一次调用):文件“try2json.py”,第 13 行,在 del json_data[0] TypeError: 'file' 对象不支持删除项目
      【解决方案5】:

      您有一个列表,其中包含两个项目,恰好是字典。要删除第一个,您可以使用list.remove(item)list.pop(0)del list[0]

      http://docs.python.org/2/tutorial/datastructures.html#more-on-lists

      【讨论】:

      • @lvo thanx 但 list.remove(0) 将从列表中删除第一项。我想从那里删除整个对象。
      • @user2511142 那么您正在尝试使用文件,而不是 json 解码的对象。先打电话给json.load()。我还在我的代码中添加了一个删除示例:ideone.com/zQphUC
      • @lvo 是的,我正在处理文件,但我在 cmd 上使用整个东西,然后显示它删除了数据,因为当我使用命令 print data[0] 时,它会在它旁边打印项目但是json文件仍然没有更新。
      • 您必须使用json.dump 保存数据。它不会自动“重新保存”数据。
      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2019-11-30
      • 2021-09-01
      相关资源
      最近更新 更多