JSON, кажется, икает на следующих утверждениях:
{"delete":{"status":{"id":12600579001,"user_id":55389449}}}
фрагмент кода:
temp = json.loads(line)
text = temp['text']
Я получаю следующий вывод ошибок, когда вышеупомянутый фрагмент кода встречается со строками, подобными вышеупомянутому JSON 'словарь':
text = temp['text']
KeyError: 'text'
Это, потому что нет никакого "текста", вводят строку или потому что "удаляют", не находится в словаре?
Почему бы не поместить это между первой и второй строками:
print temp
Судя по опубликованному вами фрагменту, temp
должен содержать только один элемент с ключом «удалить»
. У вас нет ключа 'text'
, поэтому я не уверен, что temp ['text']
должно искать.
Похоже, это происходит потому, что «текста» нет. Возможно, вы могли бы использовать что-то вроде
'text' in temp
, чтобы проверить, существует ли «текст», прежде чем пытаться его использовать.
Редактировать:
Я взял пример, приведенный в комментарии, и добавил к нему блок if / elif / else.
#! /usr/bin/python
import sys
import json
f = open(sys.argv[1])
for line in f:
j = json.loads(line)
try:
if 'text' in j:
print 'TEXT: ', j['text']
elif 'delete' in j:
print 'DELETE: ', j['delete']
else:
print 'Everything: ', j
except:
print "EXCEPTION: ", j
Пример фрагмента №1:
{u'favorited ': False, u'contributors': None, u'truncated ': False, u'text': ---- snip ----}
Пример фрагмента №2:
{u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}}}
Это потому, что в строке нет ключа "текст" или потому что "удалить" нет в словаре?
Это потому, что нет ключа "текст" . Если вы напечатаете temp
или проверите, есть ли ключ 'text'
в полученном словаре Python, вы заметите, что нет ключа с именем 'text'
. Фактически, temp
имеет только один ключ: 'delete'
. Словарь, на который ссылается 'delete'
, содержит единственный ключ 'status'
, который содержит другой словарь с двумя ключами: 'user_id'
и ' id '
.
Другими словами, ваша структура такова:
{
"delete" : {
"status" : {
"id" : 12600579001,
"user_id" : 55389449
}
}
}
Как видите, нигде нет «текстового» ключа.
Кроме того, вы можете проверить это сами:
>>> 'text' in temp
False
>>> 'delete' in temp
True
Спасибо всем за предложения. Суть проблемы заключалась в том, что формат Twitter json содержит словарь внутри словаря. Решение включает в себя двойной индекс, чтобы добраться до переменных, которые мне нужно проверить.