#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')