#python #json
#python #json
Вопрос:
Я пытаюсь загрузить файл json, используя следующий код:
with open('tweets_036.jsonl') as json_file:
data = json.load(json_file)
но я получаю следующую ошибку msg:
JSONDecodeError: Extra data: line 24289 column 2 (char 1088180)
когда я смотрю на файл / строку 24289, я вижу, что [] вызывает проблему:
"favorited": false
}
][
{
"retweeted": false,
По сравнению с предыдущими строками, это должно быть :
"favorited": false
},
{
"retweeted": false,
К вашему сведению, данные относятся к твитам, ‘retweeted’ обычно является первым элементом нового твита, в то время как ‘favorited’ является последним.
Заранее благодарю вас, если вы можете, пожалуйста, помочь.
Комментарии:
1. Вы не можете использовать,
json.load()
если ваши данные неjson
.2. это формат json, но в нем есть проблема с определенными строками..
3. Если бы он был в формате json, то
json.load()
загрузил бы его.
Ответ №1:
Используя str.replace()
tweets_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}]
Комментарии:
1. PS если это кому-нибудь полезно, я добавил только следующую строку для загрузки в DF: df = pd.io.json.json_normalize(json_data)
Ответ №2:
Вы пытаетесь использовать облако: re.sub python
Он использует этот формат:
result = re.sub(pattern, replacement, input)
Итак, в вашем случае это было бы что-то вроде этого:
clean_data = re.sub('][', '', data)
Комментарии:
1. Возможно, вы имели в виду
,
, а не''
Ответ №3:
Была такая же проблема некоторое время назад. По какой-то причине Twitter возвращает несколько структур 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
],
Я нигде не вижу, где первая квадратная скобка закрыта или, по крайней мере, где она должна быть закрыта.
Комментарии:
1. Привет, Читаун, вы помогли мне некоторое время назад с этим и предложили выше. Проблема в том, что когда я использую вышеуказанное, в некоторых случаях я получаю ошибку, поскольку в некоторых записях также есть ][ в них:
2. «описание»: «[iphoneu30a2u30d7u30eau3092u3055u304cu3059]u306bu5f53u305fu308au524du306eu691cu7d22u3092niphoneu30a2u30d7 u30ea u8d85!u691cu7d22u306f[u30adu30fcu30efu30fcu30c9][u8a55u4fa1][u8a55u4fa1u6570][u30eau30eau30fcu30b9u65e5][u4fa1u683c][u30abu30c6u30b4u30ea]u306au3069u306eu8907u5408u6761u4ef6u306bu3088u308bu30a2u30d7u30eau306eu691cu7d22u304cu53efu80fdu3067u3059nu3053u306eu30a2u30abu30a6u30f3u30c8u3067u306fu57cbu3082u308cu305fu30a2u30d7u30eau3092u30e9u30f3u30c0u30e0u306b»,
3. поэтому мы хотели бы заменить] [ только тогда, когда это «отдельный» твит
4. Привет, я попробовал еще раз с ответом DirtyBit, и, похоже, это сработало! для полноты картины вот код, который я использую: с открытым(‘tweets_036.jsonl’, ‘r’) файлом: содержимое = file.read() очистить = content.replace(‘][‘, ‘,’) # очистка здесь json_data = json.loads(clean) df = pd.io.json.json_normalize(json_data)
5. Да, кажется, там что-то неуместно. Я смог разобрать оставшуюся часть. Я опубликую код, который я использовал для его анализа, включая часть, которая позволит вам взглянуть на блок, вызывающий эту проблему. Это не соответствует допустимому формату json, поэтому может быть просто проблемой с их стороны, а не с вашей. Но не совсем уверен.