将JSON解析为CSV Twitter数据KeyError:' user'

时间:2014-06-27 03:07:07

标签: python json csv twitter

我正在尝试解析我现在在JSON文件中收集的一些推文数据。问题是一些推文中没有“用户”或“位置”。结果,我得到的消息如下:

  File "<stdin>", line 18, in <module>
  KeyError: 'user'

所以我尝试添加一个if-else语句,但它仍然给我错误信息。你下一步怎么做?

for line in lines:
    try:
            tweet = json.loads(line)

            # Ignore retweets!
            if tweet.has_key("retweeted_status") or not tweet.has_key("text"):
                    continue

            # Fetch text from tweet
            text = tweet["text"].lower()

            # Ignore 'manual' retweets, i.e. messages starting with RT             
            if text.find("rt ") > -1:
                    continue

            tweets_text.append( text )
            # I added an if-else statement, but it's still having be the error message
            if tweet['user']:
                    tweets_location.append( tweet['user']['location'] )
            else:
                    tweets_location.append("")

    except ValueError:
            pass

3 个答案:

答案 0 :(得分:2)

使用dict.get

        if tweet.get('user'):
                tweets_location.append(tweet['user'].get('location', ''))
        else:
                tweets_location.append("")

请参阅Why dict.get(key) instead of dict[key]?

答案 1 :(得分:1)

您收到了KeyError。如果要检查密钥是否在字典中,请执行:

if 'user' in tweet:
    tweets_location.append( tweet['user']['location'] )

或者你可以将它嵌入try ..except:

try:
    tweets_location.append( tweet['user']['location'] )
except KeyError:
    tweets_location.append('')

或者,您可以使用XrXrXr建议的dict的get方法。 get方法为您提供了一种提供默认值的便捷方式,即您可以在一行中完成所有操作:

tweets_location.append( tweet.get('user', '').get('location', '') )

如果'user'不是tweet中的键,则默认为空字符串;如果'location'不是tweet ['user']的键,则默认为空字符串

答案 2 :(得分:0)

通过在if语句中执行tweet['user'],您假设密钥user存在,这会引发KeyError。您可以通过执行if 'user' in tweet来测试密钥是否在dict中。或者,您可以处理类似于如何处理KeyError

ValueError
try:
    ....
    try:
        tweets_location.append( tweet['user']['location'] )
    except KeyError:
        tweets_location.append("")
except ValueError:
        pass