Как заменить ненужные символы [] при загрузке json-файла в Python?

Я пытаюсь загрузить файл 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.load(), если ваши данные не json.

quamrana 09.04.2019 12:16

это формат json, но в нем есть проблема с конкретными строками..

tezzaaa 09.04.2019 12:19

Если бы он был в формате json, то json.load() загрузил бы его.

quamrana 09.04.2019 12:21
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
2 128
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы попробуете облако: re.sub Python

Он использует этот формат:

result = re.sub(pattern, replacement, input)

Итак, в вашем случае это будет примерно так:

clean_data = re.sub('][', '', data)

Возможно, вы имели в виду ,, а не ''

DirtyBit 09.04.2019 12:23

Была такая же проблема некоторое время назад. По какой-то причине твиттер возвращает несколько структур 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
                                    ],

Я нигде не вижу, где закрывается первая квадратная скобка или, по крайней мере, где она должна быть закрыта.

Привет, Читаун, вы помогли мне некоторое время назад и предложили выше. Проблема в том, что когда я использую вышеизложенное, в некоторых случаях я получаю сообщение об ошибке, так как в некоторых записях также есть ][:

tezzaaa 09.04.2019 12:31

"description": "[iphone\u30a2\u30d7\u30ea\u3092\u3055\u304c\u3059]\u306b\u5‌​f53\u305f\u308a\u524‌​d\u306e\u691c\u7d22\‌​u3092\niphone\u30a2 \‌​u30d7\u30ea \u8d85!\u691c\u7d22\u306f[\u30ad\u30fc\u30ef\u30fc\u30c9][\u‌​8a55\u4fa1][\u8a55\u‌​4fa1\u6570][\u30ea\u‌ ​30ea\u30fc\u30b9\u65‌​e5][\u4fa1\u683c][\u‌​30ab\u30c6\u30b4\u30‌​ea]\u306a\u3069\u306‌​e\u8907\u5408\u6761\‌​u4ef6\ u306b\u3088\u3‌​08b\u30a2\u30d7\u30e‌​a\u306e\u691c\u7d22\‌​u304c\u53ef\u80fd\u3‌​067\u3059\n\u3053\u3‌​06e\u30a2\u30a2\u30a2\u30a2 6\u30f3\u30c8\u3067\‌​u306f\u57cb\u3082\u3‌​08c\u305f\u30a2\u30d‌​7\u30ea\u3092\u30e9\‌​u30f3\u30c0\u30e0\u3‌​06b",

tezzaaa 09.04.2019 12:32

поэтому мы хотели бы заменить ][ только тогда, когда он находится в «отдельном» твите.

tezzaaa 09.04.2019 12:33

О, привет @tezzaaa. ты не понял, что это ты! О да, я понимаю, что вы имеете в виду. Это только мое предположение, но вы бы хотели, чтобы между ними также была запятая. Можно ли снова отправить этот файл json с этими новыми записями, чтобы поиграть с ним?

chitown88 09.04.2019 12:59

решения в примере в этих комментариях, вы бы хотели заменить ][ на ],[. Но в ОП я думаю, что решения DirtyBit по замене ][ на , должны работать.

chitown88 09.04.2019 13:03

Привет, я попробовал еще раз с ответом 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)

tezzaaa 09.04.2019 14:09

Привет, на самом деле я пробовал код на файле большего размера, и он падает, я получаю следующее сообщение об ошибке: ValueError: Ожидается имя свойства: строка 6991314, столбец 8 (char 312487607). Ниже я напечатаю соответствующие строки из ближнего 6991314..

tezzaaa 09.04.2019 17:08

это в файле, который вы отправили?

chitown88 09.04.2019 17:09

[' "изменить размер": "обрезать"', ' },', ' "большой": {', ' [', ' {', ' "is_quote_status": false,']

tezzaaa 09.04.2019 17:12

так что не нравится: '{',

tezzaaa 09.04.2019 17:12

Да, кажется, что-то там не так. Я смог разобрать остальное. Я опубликую код, который я использовал для его анализа, включая часть, которая позволит вам посмотреть на блок, вызывающий эту проблему. Это не соответствует допустимому формату json, поэтому проблема может быть только у них, а не у вас. Но не совсем уверен.

chitown88 11.04.2019 11:58
Ответ принят как подходящий

Использование str.replace()

твиты_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)

tezzaaa 09.04.2019 14:10

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