Для моего проекта я отказался от данных Twitter в нескольких файлах jsonl, которые необходимо преобразовать в один файл, а затем снова прочитать один файл для извлечения информации.
Код, используемый для объединения нескольких json-файлов:
import glob
from tweepy import Cursor
jsonfile = glob.glob('C:\\Users\\arun\\Desktop\\Tweets\\*.jsonl')
#writejson = json.dumps('C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl', 'wb')
tweets = []
for files in jsonfile:
with open(files, 'r') as f:
for line in f:
tweets.append(json.loads(line))
Вышеупомянутый код работает нормально, но это добавляет файл json в виде строки с каждой строкой, разделенной ','.
Но я получаю «JSONDecodeError: ожидаемое значение: строка 2, столбец 1 (символ 2)»
from collections import Counter
def get_hashtags(tweet):
entities = tweet.get('entities', {}) #from tweets find entities & extract it
hashtags = entities.get('hashtags', []) #from entities find hastags & extract it
return [tag['text'].lower() for tag in hashtags] #convert as lower case and return back
fname = "C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl" # extracts tweets json file path
with open(fname, 'r') as f:
hashtags = Counter() #is a dictionary used to count hashable objects
for line in f: #Reads each line at a time
tweet1 = json.loads(line)
Пожалуйста, сообщите об этой ошибке. Спасибо !!
Откуда берется объект json? Если это модуль json из стандартной библиотеки в том виде, в каком он появляется, полезны документы: docs.python.org/3/library/json.html#json.JSONDecodeError. Скорее всего, именно так, как он говорит, синтаксический анализатор ожидает значение в строке 2 столбца 1 (char 2) ввода и не находит там значения. Если вы можете внести свой вклад, это также может помочь вам.






Ваш код на самом деле не «добавляет файл json в виде строки с каждой строкой, разделенной символами ','». Он добавляет dict (или список, или что-то еще), проанализированный из каждой строки JSON, как dict (или список, или что-то еще).
Вы не показали нам код, который на самом деле записывает этот output.jsonl, но это почти наверняка неправильный код. Скорее всего, вы делаете что-то вроде этого:
outfile = open('C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl', 'w')
for tweet in tweets:
outfile.write(str(tweet))
Или может это:
outfile = open('C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl', 'w')
outfile.write(str(tweets))
В любом случае… вот в чем проблема. Когда вы конвертируете список в строку с помощью str, вы получаете представление этого списка в Python. Это не JSON и не JSONLines.
Если вы хотите написать JSONLines, вы делаете это эффективно так же, как читаете:
outfile = open('C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl', 'w')
for tweet in tweets:
outfile.write(json.dumps(tweet) + '\n')
Но на самом деле, если вы планируете экспортировать весь список сразу, просто чтобы импортировать весь список сразу, вам нужны JSONLines вместо одного большого массива JSON?
outfile = open('C:\\Users\\arun\\Desktop\\Tweets\\output.jsonl', 'w')
json.dump(outfile, tweets)
Между тем, если у вас возникли проблемы с JSONLines, почему бы вместо того, чтобы писать его самостоятельно, не использовать протестированную реализацию, например, jsonlines?
Большое спасибо, я реализовал и работаю .... outfile = open ('C: \\ Users \\ arun \\ Desktop \\ Tweets \\ output.jsonl', 'w') за твит в твитах: outfile .write (json.dumps (твит) + '\ n')
@BalajiVenky В качестве стороны нет: вы всегда должны close любой файл, который вы open, или, лучше, использовать оператор with, чтобы сделать это автоматически. Это особенно верно для файлов, в которые вы пишете. Если программа, которая выполнила запись, все еще работает, и вы смотрите на файл, последние несколько записей могут не отображаться до тех пор, пока эта программа не вызовет close.
Определенно да. Спасибо !!
При этом файл JSON не добавляется в виде строки, каждая строка которой разделена символом ",". Он добавляет каждый текст JSON как dict (или список, или что-то еще). Если вы затем
print(tweets), илиoutfile.write(str(tweets)), или что-то в этом роде, тогда он отформатирует список как строку, но ... просто не делайте этого.