#python #json
#python #json
Вопрос:
У меня есть приведенный ниже JSON, который я анализирую с помощью json.load()
{
"participants": [
{
"name": "Joseph Bloggs"
},
{
"name": "John Doe"
}
],
"messages": [
{
"sender_name": "Joseph Bloggs",
"timestamp_ms": 1606943360034,
"content": "Hello John",
"type": "Generic"
},
{
"sender_name": "John Doe",
"timestamp_ms": 1606943285176,
"content": "Hi Joe",
"type": "Generic"
},
Я попытался перебрать сообщения для поиска строк внутри каждого значения.
import json
data = json.load(f)
for msg in data['messages']:
search = 'Jo'
if search in str(msg['sender_name']) :
print (msg['sender_name'])
Это работает и выводит строку «Joe Bloggs» или «John Doe» для каждого объекта сообщения.
Если я попытаюсь выполнить поиск по любым другим ключам, метке времени, содержимому, типу, я получу ошибку ключа, например, пытаясь выполнить поиск по всем сообщениям, в которых участники используют слово «Привет».
if search in str(msg['content']) :
print (msg['content'])
приводит к ключевой ошибке:
in <module>
if search in str(msg['content']) :
KeyError: 'content'
Я думаю, что я что-то не понимаю в json.словари / списки загрузки и Python. Почему msg[имя_отправителя] работает, но не msg [содержимое]? Спасибо
Комментарии:
1. Все ли сообщения имеют a
content
?2. Пожалуйста, включите рабочий файл JSON и исполняемый код, который выдает ошибку, с которой вы столкнулись. Трудно помочь вам как есть, поскольку есть так много вещей, которые могут пойти не так.
3. @DaniMesejo Нет, не все сообщения имеют содержимое, теперь я думаю об этом…
Ответ №1:
Я только что попробовал .get(‘content’), и это сработало…
search = 'Thing I am searching for'
if search in str(msg.get('content')) :
print (msg.get('content'))
Если кто-нибудь может уточнить, я был бы признателен. Я нашел решение, но я хотел бы понять «почему».
Спасибо
Комментарии:
1. .get() обрабатывает сценарии, когда у вас нет
content
ключа as в вашем словаре, вы также можете передать ему значение по умолчанию, если захотите, что удобно в случае вложенных dicts2. также вы можете быть осторожны с методом str(), например, если вы ищете строку в «one», то для всех значений, не совпадающих с none, вы получите «None» -s, как
str(msg.get('content'))
будет"None"
, поэтому вы можете захотеть по умолчанию использовать значение nothing вместо этого —msg.get('content', "")
Ответ №2:
Вы можете избежать KeyError с помощью метода .get() в словаре
if search in str(msg.get('content')):
print(str(msg.get('sender_name')))