Ошибка при слиянии нескольких JSON и чтении через Python

Для моего проекта я отказался от данных 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 как dict (или список, или что-то еще). Если вы затем print(tweets), или outfile.write(str(tweets)), или что-то в этом роде, тогда он отформатирует список как строку, но ... просто не делайте этого.

abarnert 23.05.2018 03:34

Откуда берется объект json? Если это модуль json из стандартной библиотеки в том виде, в каком он появляется, полезны документы: docs.python.org/3/library/json.html#json.JSONDecodeError. Скорее всего, именно так, как он говорит, синтаксический анализатор ожидает значение в строке 2 столбца 1 (char 2) ввода и не находит там значения. Если вы можете внести свой вклад, это также может помочь вам.

bschlueter 23.05.2018 03:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
80
1

Ответы 1

Ваш код на самом деле не «добавляет файл 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')

Balaji Venky 23.05.2018 17:23

@BalajiVenky В качестве стороны нет: вы всегда должны close любой файл, который вы open, или, лучше, использовать оператор with, чтобы сделать это автоматически. Это особенно верно для файлов, в которые вы пишете. Если программа, которая выполнила запись, все еще работает, и вы смотрите на файл, последние несколько записей могут не отображаться до тех пор, пока эта программа не вызовет close.

abarnert 24.05.2018 19:54

Определенно да. Спасибо !!

Balaji Venky 28.05.2018 03:45

Другие вопросы по теме