python - 解析 JSON 时彻底修复 KeyError NoneType

标签 python json twitter nonetype

我是个菜鸟,使用一些借来的 python 代码对我用 tweepy 拉取的推文进行非常简单的 JSON 解析。我尝试解决自己的问题,但似乎制造了更多问题。

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

{"limit":{"track":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' object has no attribute 'lower'

我认为必须有一个更干净、更简单的解决方案来解决这一切。有什么建议么?下面是完整的代码(减去我正在打印的一些图表以及我在数据框中创建的更多列)。

非常感谢,如果我没有掌握正确的发帖礼仪,我深表歉意。

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'] 可能是一个字符串,因此最好将缺失的字符串留空。

关于python - 解析 JSON 时彻底修复 KeyError NoneType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324858/

相关文章:

python - 查找 vim 的 virtualenv 当前包目录

python - 如何从还包含文本值的列中的字符串值中删除 '.0' 或小数点?

python - 如何在pycrypto中使用AES的CFB模式

javascript - 如何处理此 JSON 数组以删除数组每个元素中的包装对象?使用JavaScript

objective-c - 自定义 iOS Twitter 身份验证页面?

python - 具有精确时间戳的语音识别?

python Pandas : Merge Columns of Data Frame with column name into one column

php - 使用 php 将 JSON 数据插入 mysql

java - 使用 Twitter4j 获取推文

python - 将 Tweepy 与 Apigee 结合使用