Python 解析JSON时清除对KeyError NoneType的修复

Python 解析JSON时清除对KeyError NoneType的修复,python,json,twitter,nonetype,Python,Json,Twitter,Nonetype,我是一个相当不识时务的人,使用一些借用的python代码对我用tweepy拉出来的推特进行非常简单的JSON解析。我试图解决自己的问题,但似乎制造了更多的问题 .txt文件中只有几行会导致问题。一方面,文件定期包含以下内容: {“limit”:{“track”:3,“timestamp_ms”:“1487481419833”} 另一方面,对于一些tweet,tweet字段都在那里,但似乎不是JSON格式(例如,Sublime不识别语法) 结果是下面的代码给了我一个KeyError“text” t

我是一个相当不识时务的人,使用一些借用的python代码对我用tweepy拉出来的推特进行非常简单的JSON解析。我试图解决自己的问题,但似乎制造了更多的问题

.txt文件中只有几行会导致问题。一方面,文件定期包含以下内容:

{“limit”:{“track”:3,“timestamp_ms”:“1487481419833”}

另一方面,对于一些tweet,tweet字段都在那里,但似乎不是JSON格式(例如,Sublime不识别语法)

结果是下面的代码给了我一个KeyError“text”

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”对象没有属性“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])
那么:

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

字典方法
.get()
默认情况下,在缺少键的情况下返回
None
,但它可能是任何对象。在这种情况下,tweet['text']可能是一个字符串,因此最好为缺少的tweet设置为空。

可能有一条tweet没有文本?你有没有试着把推特打印出来,看看那个叛逆的推特?@omri_saadon是的,事实上我看到了问题——这就是我试图在顶部解释的。在.txt文件中偶尔会出现一个“limit”标记,而其他tweet的语法不正确(对于那些我猜缺少字段或其他内容的tweet)。在这种情况下,我猜您会得到rateLimitException,是真的吗?你希望完成什么?要避免错误还是不要在格式错误的tweet上迭代?谢谢,我得到了错误键error'text',我想我想要避免错误并继续,我想@gryf代码就是这样做的。(从.txt文件中删除这些行也很好,但不是必需的)啊,太简单了,谢谢!这似乎帮我度过了难关。你知道为什么这另一条线不能同样工作吗
tweets['country']=map(lambda tweet:tweet.get('place','')('country','')如果tweet.get('place','')!=None-None,tweets_data)
this:
tweet.get('place','')('country','')看起来像是在调用一个函数,这可能不是您想要的。这
如果tweet.get('place','')!=无
将永远不会是无
无。