2013-10-05 3 views
5

Я использую python для удаления и обновления JSON-файла, сгенерированного из данных, предоставленных пользователем, так что в базе данных должно храниться только несколько элементов. Я хочу удалить конкретный объект из файла JSON.Как удалить объект json с помощью python?

Мой файл JSON является:

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

Я хочу, чтобы удалить объект JSON с enamemark.

Поскольку я новичок в 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 
+2

Можете ли вы показать нам код, который вы пробовали? – RyPeck

+0

@RyPeck да, я редактирую свой вопрос с кодом, который я пытался .. – arglee

+0

Когда вы запускаете это, возникают ли у вас проблемы, потому что файл не изменился? – RyPeck

ответ

11

Вот полный пример, который загружает файл в формате 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 (вы не хотите изменить список, пока вы его итерации).

+0

не работает. когда я запустил его, он не соскользнул с метки из списка – arglee

+1

Хмм, я запустил этот скрипт с вашим точным вводом и метка была удалена. Сценарий выводит на новый файл с именем «updated-file.json», поэтому он не обновляет исходный файл. Может, так оно и происходит? – mdml

+0

Я на самом деле вставляю один и тот же код, но он все еще не работает. он создает тот же файл, что и предыдущий – arglee

0

У вас есть список там с двумя элементами, которые, случается, словари. Чтобы удалить первый, вы можете использовать list.remove(item) или list.pop(0) или del list[0].

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

+0

@lvo thanx, но list.remove (0) удалит первый элемент из списка. Я хочу удалить весь объект оттуда. – arglee

+0

@ user2511142 http://ideone.com/NlCTSp – Ivo

+0

Да, но он не работает здесь и показывает ошибку, что «файл» не поддерживает удаление элемента – arglee

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 
+2

Что делать, если словарь находится в * другой * позиции? –

+0

thanx @MartijnPieters, но я уже пробовал это .. это не работает. – arglee

+0

@MartijnPieters Справедливая точка. Я обновил свой ответ, чтобы выполнить линейный поиск. – Nikhil

0

Ваш 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) 
2

Правильный способ заключается в JSON десериализации его, изменять созданные объекты, а затем, в случае необходимости, сериализации их обратно JSON. Для этого используйте the json module. Короче говоря, используйте <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) 
+1

Как это может быть так просто ?! Лучший ответ! – Minoru

Смежные вопросы