Я пытаюсь загрузить файл json, используя следующий код:
with open('tweets_036.jsonl') as json_file:
data = json.load(json_file)
но я получаю следующее сообщение об ошибке:
JSONDecodeError: Extra data: line 24289 column 2 (char 1088180)
когда я смотрю на файл/строку 24289, я вижу, что [] вызывает проблему:
"favorited": false
}
][
{
"retweeted": false,
По сравнению с предыдущими строками это должно быть:
"favorited": false
},
{
"retweeted": false,
К вашему сведению, данные относятся к твитам, «ретвитнул» обычно является первым элементом нового твита, а «избранное» — последним.
Заранее спасибо, если можете, помогите.
это формат json, но в нем есть проблема с конкретными строками..
Если бы он был в формате json, то json.load()
загрузил бы его.
Вы попробуете облако: re.sub Python
Он использует этот формат:
result = re.sub(pattern, replacement, input)
Итак, в вашем случае это будет примерно так:
clean_data = re.sub('][', '', data)
Возможно, вы имели в виду ,
, а не ''
Была такая же проблема некоторое время назад. По какой-то причине твиттер возвращает несколько структур json в списке, но не разделяет списки запятой, поэтому взял каждый элемент json между [ ]
и добавил их в реальный список. Таким образом, вы получите список структурированных данных json. Вот решение, которое я использовал некоторое время назад:
import json
filename='C:/tweets_043.json'
with open(filename) as json_file:
data_str = json_file.read()
data_str = data_str.split('[',1)[-1]
data_str = data_str.rsplit(']',1)[0]
data_str = data_str.split('][')
clean_data = []
need_cleaning = False
for i, each in enumerate(data_str):
if need_cleaning == True:
hold_string = hold_string + '][' + each
if each.strip()[-1] != '}':
continue
else:
clean_data.append(hold_string.strip())
need_cleaning = False
continue
if each.strip()[-1] != '}':
hold_string = data_str[i]
need_cleaning = True
continue
else:
clean_data.append(each.strip())
need_cleaning = False
data = []
error = []
for jsonStr in clean_data:
jsonStr = '[' + jsonStr + ']'
try:
temp_data = json.loads(jsonStr.strip())
for each in temp_data:
data.append(each)
except:
print ('error')
error.append(jsonStr)
Парсит все, кроме того (где вы же указали в комментариях). Где проблема:
"large": {
[{
"is_quote_status": false,
"filter_level": "low",
"in_reply_to_screen_name": "Huawei",
"display_text_range": [
8,
53
],
Я нигде не вижу, где закрывается первая квадратная скобка или, по крайней мере, где она должна быть закрыта.
Привет, Читаун, вы помогли мне некоторое время назад и предложили выше. Проблема в том, что когда я использую вышеизложенное, в некоторых случаях я получаю сообщение об ошибке, так как в некоторых записях также есть ][:
"description": "[iphone\u30a2\u30d7\u30ea\u3092\u3055\u304c\u3059]\u306b\u5f53\u305f\u308a\u524d\u306e\u691c\u7d22\u3092\niphone\u30a2 \u30d7\u30ea \u8d85!\u691c\u7d22\u306f[\u30ad\u30fc\u30ef\u30fc\u30c9][\u8a55\u4fa1][\u8a55\u4fa1\u6570][\u30ea\u 30ea\u30fc\u30b9\u65e5][\u4fa1\u683c][\u30ab\u30c6\u30b4\u30ea]\u306a\u3069\u306e\u8907\u5408\u6761\u4ef6\ u306b\u3088\u308b\u30a2\u30d7\u30ea\u306e\u691c\u7d22\u304c\u53ef\u80fd\u3067\u3059\n\u3053\u306e\u30a2\u30a2\u30a2\u30a2 6\u30f3\u30c8\u3067\u306f\u57cb\u3082\u308c\u305f\u30a2\u30d7\u30ea\u3092\u30e9\u30f3\u30c0\u30e0\u306b",
поэтому мы хотели бы заменить ][ только тогда, когда он находится в «отдельном» твите.
О, привет @tezzaaa. ты не понял, что это ты! О да, я понимаю, что вы имеете в виду. Это только мое предположение, но вы бы хотели, чтобы между ними также была запятая. Можно ли снова отправить этот файл json с этими новыми записями, чтобы поиграть с ним?
решения в примере в этих комментариях, вы бы хотели заменить ][
на ],[
. Но в ОП я думаю, что решения DirtyBit по замене ][
на ,
должны работать.
Привет, я попробовал еще раз с ответом DirtyBit, и, похоже, он работает! для полноты вот код, который я использую: with open('tweets_036.jsonl', 'r') as file: content = file.read() clean = content.replace('][', ',') # очистка здесь json_data = json.loads(чистый) df = pd.io.json.json_normalize(json_data)
Привет, на самом деле я пробовал код на файле большего размера, и он падает, я получаю следующее сообщение об ошибке: ValueError: Ожидается имя свойства: строка 6991314, столбец 8 (char 312487607). Ниже я напечатаю соответствующие строки из ближнего 6991314..
это в файле, который вы отправили?
[' "изменить размер": "обрезать"', ' },', ' "большой": {', ' [', ' {', ' "is_quote_status": false,']
так что не нравится: '{',
Да, кажется, что-то там не так. Я смог разобрать остальное. Я опубликую код, который я использовал для его анализа, включая часть, которая позволит вам посмотреть на блок, вызывающий эту проблему. Это не соответствует допустимому формату json, поэтому проблема может быть только у них, а не у вас. Но не совсем уверен.
твиты_036.jsonl:
[
{
"favorited": false
}
][
{
"retweeted": false
}
]
Следовательно:
import json
with open('tweets_036.jsonl', 'r') as file:
content = file.read()
clean = content.replace('][', ',') # cleanup here
json_data = json.loads(clean)
print(json_data)
ВЫХОД:
[{'favorited': False}, {'retweeted': False}]
PS, если это кому-нибудь пригодится, я добавил следующую строку для загрузки в DF: df = pd.io.json.json_normalize(json_data)
Вы не можете использовать
json.load()
, если ваши данные неjson
.