Ошибка получения: JSONDecodeError: ожидаемое значение: строка 2 столбец 1 (символ 1)

#python #twitter #geolocation

#python #Twitter #геолокация

Вопрос:

Это код, который я пытаюсь запустить. Я пытаюсь извлечь данные геолокации из твитов для класса, и это метод, который я пытался попробовать, но я продолжаю получать эту ошибку, и я просто чувствую себя немного безнадежным…

 fname = 'Election2020.txt'
with open(fname, 'r') as f:
    
    #Create dictionary to later be stored as JSON. All data will be included
    # in the list 'data'
    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.")
# Save data to JSON file
with open('Election_users_geo.json', 'w') as fout:
    fout.write(json.dumps(users_with_geodata, indent=4))
  

это сообщение об ошибке, которое я получаю:

 ---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-2-74ca730155aa> in <module>
     15     geo_tweets  = 0
     16     for line in f:
---> 17         tweet = json.loads(line)
     18         if tweet['user']['id']:
     19             total_tweets  = 1

~anaconda3libjson__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    355             parse_int is None and parse_float is None and
    356             parse_constant is None and object_pairs_hook is None and not kw):
--> 357         return _default_decoder.decode(s)
    358     if cls is None:
    359         cls = JSONDecoder

~anaconda3libjsondecoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~anaconda3libjsondecoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 2 column 1 (char 1)
  

Есть ли у кого-нибудь другие предложения относительно того, как извлечь геолокации из Twitter? Я чувствую себя немного безнадежно, потому что это оказалось сложнее, чем я ожидал, и мои ограниченные навыки программирования не помогают делу.

Комментарии:

1. Можете ли вы показать нам образец строк из входного файла? Было бы несколько необычно, если бы каждая отдельная строка была полным объектом json.

2. Вы имеете в виду файл tweet, который я использую?

3. Я имею в виду Election2020.txt файл.

4. Проблема в том, что в конце каждой строки есть возврат каретки в стиле Windows, который json не может обработать. Попробуйте открыть файл в двоичном режиме.

5. Использовать open(fname, 'rb')