2015-03-09 4 views
0

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

{"published": "Tue, 03 Mar 2015 11:39:11 GMT", "title": "Goat Goat"} 
{"published": "Tue, 03 Mar 2015 11:39:11 GMT", "title": "Goat Goat"} 
{"published": "Tue, 03 Mar 2015 11:24:15 GMT", "title": "Cat cat"} 
{"published": "Tue, 03 Mar 2015 11:19:29 GMT", "title": "Chicken Chicken"} 
{"published": "Tue, 03 Mar 2015 11:19:29 GMT", "title": "Chicken Chicken"} 
{"published": "Tue, 03 Mar 2015 10:50:15 GMT", "title": "Dog Dog"} 
{"published": "Tue, 03 Mar 2015 10:34:45 GMT", "title": "Cat cat"} 

Мой подход заключается в создании сценария с инициализацией пустой список, чтение каждой строки (объекта) в файле для проверки уникальных названий и написания уникальных объектов в новый файл JSON.

from sys import argv 

script, input_file, output_file = argv 

input_file = open(input_file) 

output_file = open(output_file, 'a') 

unique = [] 

while True: 
    A = input_file.readline() 
    if A['title'] not in unique: 
     unique.append(A['title']) 
     output_file.write(A) 

Однако я получаю сообщение об ошибке ниже:

Traceback (most recent call last): 
    File "test_run.py", line 13, in <module> 
    if A['title'] not in unique: 
TypeError: string indices must be integers, not str 

Новое в Python, так бы признателен за любые идеи.

+1

Вы должны фактически разобрать в JSON из файла. Вы просто читаете строки и индексируете, как если бы они были объектами json, что неверно. –

ответ

1

Вы можете использовать название в качестве ключа в dict объекта и использовать тот факт, что ключи словаря представляют собой набор:

#!/usr/bin/env python 
import json 
with open('your_json.json') as f: 
    # load json objects to dictionaries 
    jsons = map(json.loads, f) 

uniques = {x['title']: x for x in jsons} 

# write to new json file 
with open('new_file.json' ,'w') as nf: 
    json.dump(uniques.values(), nf) 

print uniques.values() 

Или вы можете использовать json и set для этого более простой способ:

#!/usr/bin/env python 
import json 
with open('your_json.json') as f: 
    # load json objects to dictionaries 
    jsons = map(json.loads, f) 

result = list() 
items_set = set() 

for js in jsons: 
    # only add unseen items (referring to 'title' as key) 
    if not js['title'] in items_set: 
     # mark as seen 
     items_set.add(js['title']) 
     # add to results 
     result.append(js) 

# write to new json file 
with open('new_file.json' ,'w') as nf: 
    json.dump(result, nf) 

print result 

Выход:

[{u'title': u'Goat Goat', u'published': u'Tue, 03 Mar 2015 11:39:11 GMT'}, {u'title': u'Cat cat', u'published': u'Tue, 03 Mar 2015 11:24:15 GMT'}, {u'title': u'Chicken Chicken', u'published': u'Tue, 03 Mar 2015 11:19:29 GMT'}, {u'title': u'Dog Dog', u'published': u'Tue, 03 Mar 2015 10:50:15 GMT'}] 

note: Это приведет к сериализации списка в виде списка, а не строки после строки, как ваш исходный файл. Для этого вы можете использовать:

# write to new json file 
with open('new_file.json' ,'w') as nf: 
    for js in uniques.values(): 
     nf.write(json.dumps(js)) 
     nf.write('\n') 
1

Вам необходимо использовать библиотеку json. Вместо простого чтения файла используйте:

import json 

with open(input_file, 'r') as infile: 
    A = json.load(infile) 

Это должно решить эту проблему. Однако в вашем коде есть еще несколько проблем.

Почему вы используете while True? Это никогда не прекратится, и вместо этого выйдет исключение, когда ваш файл input_file не имеет больше строк.

Вместо этого вы можете просто преобразовать свой список в набор, который гарантирует уникальность. Обратите внимание, что это даст уникальность всем полям, а не только заголовку. Есть, что следующим образом: unique = set(A)

Наконец, вы должны будете использовать библиотеку JSON, чтобы записать его в свой выходной файл:

with open(output_file, 'w') as outfile: 
    json.dump(result, outfile) 
Смежные вопросы