#python #arrays #json #python-2.7
#питон #массивы #json #python-2.7
Вопрос:
У меня уже есть файл JSON, который я анализирую с помощью Python 2.7, и я хочу сбросить проанализированные данные в другой пустой файл JSON. Я использую цикл for для анализа данных из старого файла JSON, и в то же время в рамках этого цикла я хочу добавить к этому новому файлу JSON. Мой исходный JSON-файл имеет форму массива JSON. Примечание: Новый файл JSON будет иметь те же ключи, что и старый файл JSON, т.е. Я просто разбираю данные в соответствии с условием if, а затем вставляю весь индекс (который удовлетворяет условию) из старого JSON в новый JSON. Старый JSON = «output_log.json» Новый JSON = «cumulative_output.json»
Новый файл JSON будет представлять собой список индексов, например, что-то вроде этого:
[{"name":".....", "commit":".....", "author":"...", "title":"...", "body":"..."},
{"name":".....", "commit":".....", "author":"...", "title":"...", "body":"..."},
.........
]
with open("output_log.json", 'r') as f:
json_ob = json.load(f)
for index in range(len(json_ob)):
if (bool(re.search(r"s", json_ob[index]['name']))) is True and ('444' in json_ob[index]['title']) and ('https://robotics.com/projects/' in json_ob[index]['body']):
with open('cumulative_output.json', 'a') as f:
entry = {'name': json_ob[index]['name'], 'commit': json_ob[index]['commit'], 'author': json_ob[index]['author'], 'title': json_ob[index]['title'], 'body': json_ob[index]['body']}
f.write(entry)
f.write(",")
Комментарии:
1. Вам нужна одна строка JSON в выходном файле? Обработайте все в список, а затем json.дамп этого списка.
2. @tdelaney Я отредактировал вопрос, чтобы показать пример нового файла JSON. Я просто хочу добавлять по мере анализа данных, чтобы сэкономить время
Ответ №1:
Вы читаете и записываете один объект списка JSON, поэтому не так много возможностей выполнять итеративные действия. Ваш текущий код завершается с ошибкой, потому что вы не можете написать словарь python ( f.write(entry)
) без какой-либо сериализации. Прочитав список JSON, вы можете отфильтровать его и записать снова. Вам не нужны дополнительные сложности с индексацией списка, который вы читаете, просто повторите его. И поскольку вы хотите записать всю запись целиком, вам не нужно создавать новый словарь.
with open("output_log.json") as f:
json_ob = json.load(f)
entries = []
for entry in json_ob:
if (re.search(r"s", entry["name"]) and ("444" in entry["title"])
and (r"https://robotics.com/projects/" in entry["body"])):
entries.append(entry)
with open("cumulative_output.json", "w") as f:
json.dump(entries)