13

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

我的 JSON 文件是:

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

我想删除 JSON 对象ename mark

由于我是 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
4

5 回答 5

23

这是一个完整的示例,它加载 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循环结束后立即将其全部删除(您不希望在迭代列表时修改列表)。

于 2013-10-05T21:07:01.717 回答
8

json 的正确方法是反序列化它,修改创建的对象,然后,如果需要,将它们序列化回 json。为此,请使用json 模块。简而言之,<deserialized object> = json.loads(<some json string>)用于读取 json 并<json output> = json.dumps(<your object>)创建 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)
于 2013-10-05T21:34:38.027 回答
2

您的 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))
于 2013-10-05T21:15:11.547 回答
0

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

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

于 2013-10-05T18:32:39.450 回答
0

您需要使用该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
于 2013-10-05T18:34:25.630 回答