2017-02-19 2 views
1

Я довольно noob и использую какой-то заимствованный код на Python для очень простого анализа JSON твитов, которые я потянул с tweepy. Я пытался решить себя, но, похоже, создает больше проблем.Очистить исправление для KeyError NoneType при разборе JSON

Просто несколько строк в файле .txt вызывают проблемы. С одной стороны, этот файл содержит это периодически:

{"limit":{"track":3,"timestamp_ms":"1487481419833"}}

С другой стороны, для некоторых твитов поля Чирикать все есть, но, кажется, не быть в формате JSON (например, Sublime не распознает синтаксис например).

В результате приведенный ниже код дает мне KeyError «текст»

tweets['text'] = map(lambda tweet: tweet['text'], tweets_data) 

Так что я исправить, изменив его:

tweets['text'] = map(lambda tweet: tweet.get('text', None), tweets_data) 

Однако, теперь я получаю другую ошибку позже мой код при использовании:

def word_in_text(word, text): 
word = word.lower() 
text = text.lower() 
match = re.search(word, text) 
if match: 
    return True 
return False 

Я получаю ошибку:

AttributeError: 'NoneType' object has no attribute 'lower'

Я полагаю, что должно быть более чистое, более простое решение для всего этого. Какие-либо предложения? Ниже приведен полный код (минус несколько графиков, которые я печатаю, и несколько столбцов, которые я создал в dataFrame).

Большое спасибо и извини, если у меня нет надлежащего этикета.

import json 
import pandas as pd 
import matplotlib.pyplot as plt 
import re 

tweets_data_path = '[...trump_tweets.txt]' 

tweets_data = [] 
tweets_file = open(tweets_data_path, "r") 
for line in tweets_file: 
try: 
    tweet = json.loads(line) 
    tweets_data.append(tweet) 
except: 
    continue 

print "Number of tweets included is " + str(len(tweets_data)) 

tweets = pd.DataFrame() 

tweets['text'] = map(lambda tweet: tweet.get('text', None), tweets_data) 
tweets['lang'] = map(lambda tweet: tweet.get('lang', None), tweets_data) 
tweets['country'] = map(lambda tweet: tweet.get('place', None), tweets_data) 

def word_in_text(word, text): 
word = word.lower() 
text = text.lower() 
match = re.search(word, text) 
if match: 
    return True 
return False 

search_term_1 = 'America' 
search_term_2 = 'POTUS' 
search_term_3 = 'ban' 

tweets[search_term_1] = tweets['text'].apply(lambda tweet: word_in_text(search_term_1, tweet)) 
tweets[search_term_2] = tweets['text'].apply(lambda tweet: word_in_text(search_term_2, tweet)) 
tweets[search_term_3] = tweets['text'].apply(lambda tweet: word_in_text(search_term_3, tweet)) 

print "tweets mentioning search_term_1: " + str(tweets[search_term_1].value_counts()[True]) 
print "tweets mentioning search_term_2: " + str(tweets[search_term_2].value_counts()[True]) 
print "tweets mentioning search_term_3: " + str(tweets[search_term_3].value_counts()[True]) 
+0

Возможно, у одного из твитов нет текста? вы пытались напечатать твиты и посмотреть на мятежный? –

+0

@omri_saadon Да, я вижу проблему на самом деле - вот что я пытался объяснить наверху. В файле .txt есть временная отметка «limit», а другие твиты не отображаются в правильном синтаксисе (для тех, кого я предполагаю, что поле отсутствует или что-то еще). – Kees

+0

В этом случае, я думаю, вы получаете rateLimitException, это правда? Что вы хотите достичь? во избежание ошибки или не перебора неправильных твитов? –

ответ

1

Как насчет:

tweets['text'] = map(lambda tweet: tweet.get('text', ''), tweets_data) 

метод Словарь .get() по умолчанию возврата None в случае отсутствия ключа, но это может быть любой объект. В этом случае твит ['text'], возможно, является строкой, поэтому было бы неплохо положить пустую для ее отсутствия.

+0

Ах так просто, спасибо! Кажется, это меня охватило. Вы знаете, почему эта другая линия не будет работать аналогичным образом? 'tweets ['country'] = map (лямбда-твит: tweet.get ('место', '') ('страна', ''), если tweet.get ('place', '')! = None else None, tweets_data) ' – Kees

+0

:' tweet.get ('place', '') ('country', '') 'похоже на вызов функции, которая, вероятно, не то, что вы хотите. это 'if tweet.get ('place', '')! = None' никогда не будет' None'. – gryf

Смежные вопросы