Вывести каждую строку json в новый файл .json, используя Python - PullRequest
0 голосов
/ 03 октября 2018

У меня есть файл json;Мне нужно удалить ключ id из содержимого, что я могу сделать с моим кодом.

Теперь я хочу напечатать каждую строку файла json в новом файле и использовать имя, хранящееся вmy json для имени файла.

My json file ex:

{"categories":["Test"],"indications":[{"@class":"=indication.BuildLogIndication","pattern":".*TypeError .*"},{"@class":"model.indication.BuildLogIndication","pattern":".*LoadError .*"}],"modifications":[{"time":{"$date":"2015-10-08T20:01:54.075Z"}},{"user":"user1","time":{"$date":"2015-03-04T18:38:58.123Z"}},{"user":"user2","time":{"$date":"2014-11-13T01:54:13.906Z"}},{"time":{"$date":"2014-09-02T18:48:05.000Z"}}],"lastOccurred":{"$date":"2017-01-25T20:05:17.180Z"}}
{"pattern":".*look for this string.*"}],"modifications":[{"time":{"$date":"2014-09-02T18:52:20.000Z"}}],"lastOccurred":{"$date":"2014-11-04T00:43:32.945Z"},"_removed":{"timestamp":{"$date":"2014-11-13T01:52:44.346Z"},"by":"user3"},"active":false}

Код для удаления идентификатора:

import json
import sys
import re
import fileinput

infile = "failure.json"
outfile = "failure1.json"

fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
    for word in line:
        line = re.sub("\"_id.*?},","", line)
    fout.write(line)
    file.write("%d\n" % n)
fin.close()
fout.close()

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

В качестве примера ввода вы видите json объект в каждой строке.

Таким образом, мое решение считывает каждую строку и преобразует ее в python dict (используя json.loads()), удаляет требуемый ключ из dict (используя dict.pop() для сбоя без вывода сообщений, если ключ отсутствует) и преобразует его обратно в строку (используя json.dumps()), который затем записывается в новый файл.

import json

infile = "failure.json"
outfile = "failure1.json"
key = '_id'

with open(infile) as f_read:
    with open(outfile, 'w') as f_write:
        for line in f_read:
            line = line.strip()
            if len(line) > 0:
                try:
                    elem = json.loads(line)
                    elem.pop(key, None)
                    f_write.write('{}\n'.format(json.dumps(elem)))
                except json.JSONDecodeError:
                    pass

РЕДАКТИРОВАТЬ: очевидно, каждая строка json должна входить в отдельный новый файл, согласно комментариям ОП.Это можно сделать так, например:

import json

infile = "failure.json"
key_to_remove = '_id'

with open(infile) as f_read:
    for line in f_read:
        line = line.strip()
        if len(line) > 0:
            try:
                elem = json.loads(line)
                elem.pop(key_to_remove, None)

                outfile = '{}.json'.format(elem['name'])      # this may raise KeyError
                with open(outfile, 'w') as f_write:
                    f_write.write('{}\n'.format(json.dumps(elem)))
            except json.JSONDecodeError:
                pass
0 голосов
/ 05 октября 2018

Вы импортировали пакет json, но не используете его.Вы должны, это здорово.

Получить вашу строку из файла, а затем использовать json.loads(), чтобы загрузить строку в объект json.Оттуда вы можете получить каждый элемент объекта json с помощью for key in json_object.

0 голосов
/ 03 октября 2018

Для удаления вы можете использовать что-то вроде этого:

import json
import sys
import re
import fileinput

with open('failure.json') as data_file:
    data = json.load(data_file)
    del data['_id']


with open('failure2.json', 'w') as data_file:
    data = json.dump(data, data_file)

и для создания файла со значением идентификатора, просто проанализируйте data объект и значение id узла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...