У меня есть файл json, который выглядит так:
[
{
"id": 1,
"first_name": "Clemens",
"last_name": "Parramore",
"email": "[email protected]",
"gender": "Male",
"ip_address": "223.150.139.137"
},
{
"id": 1000,
"first_name": "Theodore",
"last_name": "Agostini",
"email": "[email protected]",
"gender": "Male",
"ip_address": "6.131.228.196"
}
]
И я пытаюсь отфильтровать его, чтобы, если он содержит определенные символы, он сохранялся в новом json. Мой метод не дает результатов, в новом файле содержится вся информация из исходного json:
f = open('./data/data.json','r')
data = json.load(f)
fj = open('new.json', 'w')
for line in str(data).split('{'):
if "google" in line:
print(line, end = "\n")
fj.write(line)
Однако в печати я получаю то, что хочу. Я знаю, что метод неправильный, может ли кто-нибудь мне помочь? Спасибо
Обратите внимание, что ваш текущий подход фактически не обрабатывает файл json как json, он обрабатывает его как строку, и в результате вывод недействителен json. Какие поля вам интересно проверить, содержит ли email
"google"
?
Да, я только те, которые содержат определенную строку, но я не знаю, как это сделать, обработав ее как строку.
Вы можете использовать literal_eval
функцию ast
, чтобы записать необработанные данные в другой файл, используя json.dumps
, чтобы сделать результат красивым, после фильтрации почтовых значений, содержащих google
библиотеку, например
import json
import ast
elm=[]
with open('data.json') as f, open('new.json', 'w') as f_out:
data = ast.literal_eval(f.read())
for i in range(0,len(data)):
val = data[i]['email'].split('@')[1]
if val[:val.find('.')]=='google': -- only mail addresses with "@google." syntax is kept within the result file,
-- "[email protected]" is not kept as an example.
elm.append(data[i])
f_out.write(json.dumps(elm, indent=4))
Тоже работает, но я не понимаю метод
можешь сказать что ты не понял? @MickiTicki
Букле часть.
@MickiTicki ищет каждого члена data[i]
(где i=0,1,..) данного словаря и получает письма только со значениями ....@google.<the rest>
Ладно, читаю про ast модуль. Знай, я понял. Спасибо за ответ :D
Это должно помочь вам начать. Пожалуйста, оставьте комментарий, если вам нужно что-то более конкретное.
import json
to_be_saved = []
with open("data/data.json") as raw_data:
data = json.load(raw_data)
for entry in data:
if "google" in entry["email"]:
to_be_saved.append(entry)
# Alternatively, if you only want to check the email domain,
# use this instead of the lines above:
# if "google" in entry["email"].split("@")[1]:
# to_be_saved.append(entry)
# print(to_be_saved)
with open("result.json", "w") as output_data:
output_data.write(json.dumps(to_be_saved, indent=2))
results.json после запуска этого скрипта:
[
{
"id": 1,
"first_name": "Clemens",
"last_name": "Parramore",
"email": "[email protected]",
"gender": "Male",
"ip_address": "223.150.139.137"
}
]
этот метод также сохраняет почту со значением [email protected]
в новом файле @MickiTicki
Добавлен код с комментариями на случай, если OP хочет отфильтровать домен электронной почты.
О, это правда. Так круто. Спасибо @HubertGrzeskowiak
правильно, добавил после предупреждения о случае :) @MickiTicki
Я не могу воспроизвести это. Ваш код печатает на стандартный вывод и записывает в файл, как и ожидалось. Я попытался использовать строку, которая действительно встречается в опубликованных вами данных (поскольку
"google"
нет.