2017-02-19 64 views
1

我很漂亮的noob,並且使用一些借用的python代碼實現了一個非常簡單的用tweepy拉動的推文的JSON解析。我試圖解決自己,但似乎創造更多的問題。在解析JSON時徹底修復KeyError NoneType

只是.txt文件中的幾行導致問題。在一方面,該文件包含此週期性:

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

在另一方面,對於一些鳴叫鳴叫領域都在那裏,但似乎無法在JSON格式(例如崇高不能識別語法這樣)。

結果是下面的代碼給了我一個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文件中偶爾會有一個「限制」標記,而其他推文不會以正確的語法出現(對於那些我猜測字段丟失或其他內容的人)。 – Kees

+0

在這種情況下,我想你會得到rateLimitException,這是真的嗎?你想完成什麼?爲了避免錯誤或不重複畸形的微博? –

回答

1

如何:在缺少關鍵的情況下

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

字典方法.get()默認返回None,但它可能是任何對象。在這種情況下,tweet ['text']可能是一個字符串,所以將空置於缺少的字符是一個好主意。

+0

啊,這麼簡單,謝謝!這似乎讓我通過它。你知道爲什麼這條線路不能同樣工作嗎? 'tweets ['country'] =地圖(lambda tweet:tweet.get('place','')('country','')if tweet.get('place','')!=無其他無, tweets_data)' – Kees

+0

this:'tweet.get('place','')('country','')'好像調用一個函數,這可能不是你想要的。如果tweet.get('place','')!= None'永遠不會成爲'None'。 – gryf