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

#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, поэтому может быть просто проблемой с их стороны, а не с вашей. Но не совсем уверен.