解析JSON时,清除KeyError NoneType的修复

时间:2017-02-19 07:48:37

标签: python json twitter nonetype

我很漂亮,并使用一些借来的python代码,我用Tweety推送了一个非常简单的JSON推文解析。我试过解决自己,但似乎在制造更多问题。

.txt文件中的几行会导致问题。一方面,该文件定期包含:

  

{"限制" {"轨道":3," TIMESTAMP_MS":" 1487481419833"}}

另一方面,对于一些推文,推文字段都在那里,但似乎不是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])

1 个答案:

答案 0 :(得分:1)

怎么样:

getStream(streams + twitch[i], i);
getChannels(channels + twitch[i], i);

字典方法tweets['text'] = map(lambda tweet: tweet.get('text', ''), tweets_data) 默认返回.get()以防丢失密钥,但它可能是任何对象。在这种情况下,tweet ['text']可能是一个字符串,因此最好将空的内容丢失。