2017-07-21 92 views
-1

我想用Python來分析Twitter的數據(JSON文件),這裏是腳本:Twitter的:「dict_keys」對象不支持索引

import json 
fname = 'analisis.json' with open(fname, 'r') as f: 

users_with_geodata = { 
    "data": [] 
} 
all_users = [] 
total_tweets = 0 
geo_tweets = 0 
for line in f: 
    tweet = json.loads(line) 
    if tweet['user']['id']: 
     total_tweets += 1 
     user_id = tweet['user']['id'] 
     if user_id not in all_users: 
      all_users.append(user_id) 

      #Give users some data to find them by. User_id listed separately 
      # to make iterating this data later easier 
      user_data = { 
       "user_id" : tweet['user']['id'], 
       "features" : { 
        "name" : tweet['user']['name'], 
        "id": tweet['user']['id'], 
        "screen_name": tweet['user']['screen_name'], 
        "tweets" : 1, 
        "location": tweet['user']['location'], 
       } 
      } 
      #Iterate through different types of geodata to get the variable primary_geo 
      if tweet['coordinates']: 
       user_data["features"]["primary_geo"] = str(tweet['coordinates'][tweet['coordinates'].keys()[1]][1]) + ", " + str(tweet['coordinates'][tweet['coordinates'].keys()[1]][0]) 
       user_data["features"]["geo_type"] = "Tweet coordinates" 
      elif tweet['place']: 
       user_data["features"]["primary_geo"] = tweet['place']['full_name'] + ", " + tweet['place']['country'] 
       user_data["features"]["geo_type"] = "Tweet place" 
      else: 
       user_data["features"]["primary_geo"] = tweet['user']['location'] 
       user_data["features"]["geo_type"] = "User location" 
      #Add only tweets with some geo data to .json. Comment this if you want to include all tweets. 
      if user_data["features"]["primary_geo"]: 
       users_with_geodata['data'].append(user_data) 
       geo_tweets += 1 

     #If user already listed, increase their tweet count 
     elif user_id in all_users: 
      for user in users_with_geodata["data"]: 
       if user_id == user["user_id"]: 
        user["features"]["tweets"] += 1 

#Count the total amount of tweets for those users that had geodata    
for user in users_with_geodata["data"]: 
    geo_tweets = geo_tweets + user["features"]["tweets"] 
#Get some aggregated numbers on the data 
print ("The file included ") + str(len(all_users)) + (" unique users who tweeted with or without geo data") 
print ("The file included ") + str(len(users_with_geodata['data'])) + (" unique users who tweeted with geo data, including 'location'") 
print ("The users with geo data tweeted ") + str(geo_tweets) + (" out of the total ") + str(total_tweets) + (" of tweets.") 

with open('analisis_geo.json', 'w') as fout: 
fout.write(json.dumps(users_with_geodata, indent=4)) 

,當我在Python 3.6.1運行,有錯誤消息: ​​ 。但在Python 2.7.13中,腳本可以很好地運行,如下所示: python 2.7.13 。有誰知道如何使腳本與Python 3.6.1兼容?

回答

0

Python 3 dict.keys()返回不同類型的對象。爲了通過索引訪問密鑰,您需要將其轉換爲list。所以

keys = list(my_dict.keys())[0]

您也可以通過按鍵進行迭代,你會在for循環,並沒有真正幫助你在這裏,雖然。

for key in my_dict.keys(): 
    # do things 
+0

你能告訴我我要編輯哪個腳本部分嗎? 對不起,因爲我不知道Python,所以我從互聯網上得到了腳本。 –