ошибка пропуска атрибута при импорте данных из твиттера в панды - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть почти 1 ГБ файл, в котором хранится почти 0,2 млн твитов. И огромный размер файла явно несет в себе некоторые ошибки. Ошибки отображаются как AttributeError: 'int' object has no attribute 'items'. Это происходит, когда я пытаюсь запустить этот код.

 raw_data_path = input("Enter the path for raw data file: ")
 tweet_data_path = raw_data_path



 tweet_data = []
 tweets_file = open(tweet_data_path, "r", encoding="utf-8")
 for line in tweets_file:
   try:
    tweet = json.loads(line)
    tweet_data.append(tweet)
   except:
    continue


    tweet_data2 = [tweet for tweet in tweet_data if isinstance(tweet, 
   dict)]



   from pandas.io.json import json_normalize    
tweets = json_normalize(tweet_data2)[["text", "lang", "place.country",
                                     "created_at", "coordinates", 
                                     "user.location", "id"]]

Можно ли найти решение, где те строки, в которых возникает такая ошибка, можно пропустить и продолжить для остальных строк.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Окончательная форма кода выглядит следующим образом:

tweet_data_path = raw_data_path

 tweet_data = []
 tweets_file = open(tweet_data_path, "r", encoding="utf-8")

for line in tweets_file:
   try:
      tweet = json.loads(line)
      if isinstance(tweet, dict): 
         tweet_data.append(tweet)
      except: 
         continue

Это устраняет все возможные ошибки атрибутов, которые могут помешать импорту в panda dataframe.

0 голосов
/ 25 апреля 2018

Проблема здесь не в строках данных, а в самом tweet_data. Если вы проверите свои tweet_data, вы найдете еще один элемент, имеющий тип данных 'int' ( при условии, что ваш tweet_data представляет собой список словарей, поскольку он ожидает только "dict или list of dicts" ).

Возможно, вы захотите проверить данные твита, чтобы удалить значения, отличные от словарей.

Мне удалось воспроизвести приведенный ниже пример для json_normalize документа :

Рабочий пример:

from pandas.io.json import json_normalize
data = [{'state': 'Florida',
         'shortname': 'FL',
         'info': {
              'governor': 'Rick Scott'
         },
         'counties': [{'name': 'Dade', 'population': 12345},
                     {'name': 'Broward', 'population': 40000},
                     {'name': 'Palm Beach', 'population': 60000}]},
        {'state': 'Ohio',
         'shortname': 'OH',
         'info': {
              'governor': 'John Kasich'
         },
         'counties': [{'name': 'Summit', 'population': 1234},
                      {'name': 'Cuyahoga', 'population': 1337}]},
       ]
json_normalize(data)

Выход:

Отображение данных

Ошибка воспроизведения:

from pandas.io.json import json_normalize
data = [{'state': 'Florida',
         'shortname': 'FL',
         'info': {
              'governor': 'Rick Scott'
         },
         'counties': [{'name': 'Dade', 'population': 12345},
                     {'name': 'Broward', 'population': 40000},
                     {'name': 'Palm Beach', 'population': 60000}]},
        {'state': 'Ohio',
         'shortname': 'OH',
         'info': {
              'governor': 'John Kasich'
         },
         'counties': [{'name': 'Summit', 'population': 1234},
                      {'name': 'Cuyahoga', 'population': 1337}]},
       1  # *Added an integer to the list*
       ]
result = json_normalize(data)

Ошибка:

AttributeError: 'int' object has no attribute 'items'

Как удалить "tweet_data" : Не требуется, если вы следите за обновлением ниже

Перед нормализацией запустите ниже:

tweet_data = [tweet for tweet in tweet_data if isinstance(tweet, dict)]

Обновление: (для цикла)

for line in tweets_file:
    try:
        tweet = json.loads(line)
        if isinstance(tweet, dict): 
            tweet_data.append(tweet)
    except:
        continue
...