Поиск по строкам json в Python
Дан файл json - data.json. данные с сайта через парсинг постоянно обновляются. В нем находятся примерно такие данные:
{
"data": [
{
"id": 60288,
"name": "Моя пиратская свадьба",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Комедия, Боевик, Мелодрама",
"type": "Фильмы",
"country": "США",
},
{
"id": 62976,
"name": "Подземный дьявол",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Ужасы",
"type": "Фильмы",
"country": "США",
},
{
"id": 63002,
"name": "Бескрайний бассейн",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Ужасы, Фантастика, Детектив, Триллер",
"type": "Фильмы",
"country": "Канада, Франция, Венгрия",
},
{
"id": 62362,
"name": "Сволочи",
"year": 2023,
"quality": "TS",
"genre": "Криминал, Комедия, Боевик, Триллер",
"type": "Фильмы",
"country": "Индия",
},
{
"id": 63007,
"name": "Памела: История любви",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Документальный, Биографический",
"type": "Фильмы",
"country": "США",
},
{
"id": 63028,
"name": "Олег Яковлев. Чужой",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Документальный, Биографический",
"type": "Фильмы",
"country": "Россия",
}
]
}
Есть переменная в нее каждый цикл выгружается новый id, например film_id=63028.
Делаю проверку блоков по id уже записанных в файл:
with open ('data.json', 'r', encoding='utf8') as file:
datafilm = json.load(file)
for id in datafilm['data']:
try:
if film_id == id['id']:
print(есть в бд)
except KeyError:
print("ID doesn't exist")
и скрипт проходя цикл каждый раз с новым id производит поиск по всей бд и в консоль что в data.json есть строка с этим id, находит строку выводит что она есть и происходит следующий цикл поиска.
но мне нужно чтобы в случае если в бд нет id из цикличной переменной то происходило одинарное событие типа print(id в бд нет)
для этого я добавил в код
with open ('news_films.json', 'r', encoding='utf8') as file:
datafilm = json.load(file)
for id in datafilm['data']:
try:
if film_id == id['id']:
print("есть в бд")
else:
print("нет в бд")
except KeyError:
print("ID doesn't exist")
в итоге скрипт проходит по каждой строке id и выводит "нет в бд" консоль выводит "нет в бд" столько раз сколько строк бд
как в else: реализовать, чтобы скрипт тихо проходил по всем строкам сравнивал все id с переменной и в случае полного отсутствия id в бд 1 раз выводил "нет в бд"?
Ответы (2 шт):
Вариант 1
Можно использовать else: для for, а также .get() для словаря
import json
json_text = '''{
"data": [
{
"id": 60288,
"name": "Моя пиратская свадьба",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Комедия, Боевик, Мелодрама",
"type": "Фильмы",
"country": "США"
},
{
"id": 62976,
"name": "Подземный дьявол",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Ужасы",
"type": "Фильмы",
"country": "США"
},
{
"id": 63002,
"name": "Бескрайний бассейн",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Ужасы, Фантастика, Детектив, Триллер",
"type": "Фильмы",
"country": "Канада, Франция, Венгрия"
},
{
"id": 62362,
"name": "Сволочи",
"year": 2023,
"quality": "TS",
"genre": "Криминал, Комедия, Боевик, Триллер",
"type": "Фильмы",
"country": "Индия"
},
{
"id": 63007,
"name": "Памела: История любви",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Документальный, Биографический",
"type": "Фильмы",
"country": "США"
},
{
"id": 63028,
"name": "Олег Яковлев. Чужой",
"year": 2023,
"quality": "FHD (1080p)",
"genre": "Документальный, Биографический",
"type": "Фильмы",
"country": "Россия"
}
]
}'''
film_id = 63029
datafilm = json.loads(json_text)
for id in datafilm['data']:
if film_id == id.get('id'):
print(f'id {film_id} есть в БД')
break
else:
print(f'id {film_id} нет в БД')
id 63029 нет в БД
Вариант 2 - c использованием pandas
import pandas as pd
film_id = 63029
datafilm = pd.read_json(json_text)
if datafilm['data'].str['id'].isin([film_id]).any():
print(f'id {film_id} есть в БД')
else:
print(f'id {film_id} нет в БД')
Сделайте так:
# эту часть можно сделать один раз
with open ('data.json', 'r', encoding='utf8') as f:
datafilm = json.load(f)
data_ids = set(r['id'] for r in datafilm['data'] if 'id' in r)
# эта проверка может быть сделана много раз для разных film_id
# она очень быстрая
if film_id in data_ids:
print('есть в бд')
else:
print('нет в бд')