Сведение нескольких объектов в файл JSON

Я пытаюсь сгладить JSON с помощью python, но многие файлы JSON имеют более одного объекта, и из-за этого скрипт python не может его сгладить.

Например:

{........
} {
 ......
}

Есть 3000 файлов, в которых это проблема, я даже не могу вручную поставить скобки [] и составить список, как я могу сгладить такие файлы JSON, пожалуйста?

Текущий код, который я использую:

import json
import pandas as pd
from pandas.io.json import json_normalize
import glob
import os
import csv
import xlsxwriter
counter=0
counter1=0

writer = pd.ExcelWriter('......', engine = 'xlsxwriter')
path  = '/Users/.......''
dataframeLS = []
for subfolder in os.listdir(path):
    for filename in glob.glob(os.path.join (path+subfolder, '*.json')):
        with open(filename) as f:
            try:
                data = json.load(f)
                dataframeLS.append(data)
                counter1=counter1+1

            except:  
                counter=counter+1
                pass

A = pd.io.json.json_normalize(dataframeLS, errors = 'ignore')
A.to_excel(writer, sheet_name = 'Sheet1')
writer.save()
print(counter)  # number of files with error
print(counter1) # number of flattened files successfully

Вы можете показать пример кода? Вам будет легче помочь.

sashaaero 12.11.2018 22:26

Я думаю, что у меня проблема, но было бы лучше, если бы вы поместили несколько примеров, таких как входной файл json, фактический результат и ожидаемый результат :)

dim_user 12.11.2018 22:27

Извините, ребята, это мой первый пост, я добавил код, который использую, спасибо

vb2489 12.11.2018 22:39
Почему в 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
394
1

Ответы 1

Итак, образец файла будет выглядеть так?

{
   "temp":1
}
{
   "temp":2
}

Чтобы импортировать это в Python, вы можете сначала прочитать файл как текст, а затем исправить синтаксические ошибки. Если вы используете регулярное выражение, вы можете иметь дело даже с нерегулярными пробелами.

Регулярное выражение выглядит так:

}[^,]*{
  • } соответствует завершающему }
  • [^,] соответствует любому символу, кроме ,
  • [^,]* соответствует как можно большему количеству символов, кроме ,.
  • { соответствует открытию {

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

import json
import re

file = open("bad_json.json", "r")
text = file.read()
file.close()

text # '{\ntemp:1\n}\n{\ntemp:2\n}'

# we convert it to an array
# add outer brackets
text = "["+text+"]"

# use the regex to replace bad formatting
pattern = re.compile(r"}[^,]*{")
new_text = re.sub(pattern,"},{", text)


data = json.loads(new_text)

Привет, решение не работает bcos неправильных пробелов между двумя фигурными скобками, любое решение о том, как решить эту проблему, пожалуйста?

vb2489 13.11.2018 00:29

Привет, @lhk, образец файла на самом деле выглядит так: {"temp": 1} {"temp": 2} Как будто конец фигурной скобки temp 1 и начало фигурной скобки temp 2 находятся на одной строке, а не в другой строке, я надеюсь, что эта информация имеет значение, поскольку код все еще не работает.

vb2489 13.11.2018 15:49

Это странно. Если я возьму ваш образец (из вашего комментария, скобки в той же строке) и вставлю его в свой код, он будет работать нормально. Вы можете проверить это, заменив часть загрузки файла на text = '{"temp": 1} {"temp": 2}'. Вы скопировали мой точный код?

lhk 13.11.2018 16:06

Да, он работает, но происходят две вещи: 1) Двойные кавычки «Ключ»: «Значение» преобразуются в одинарные кавычки «Ключ»: «Значение» 2) Я пытаюсь проверить с помощью JsonLint, он показывает ошибка: ожидая 'STRING', '}', получил 'undefined', который я искал в Google, и кто-то из StackOverflow упомянул, что "строковые литералы JSON должны использовать обычные кавычки ("), а не умные кавычки ("") ", но после запуска код, 1) происходит !!

vb2489 13.11.2018 17:25

Я не понимаю, что ты делаешь. Мой код не заменяет кавычки, поэтому это должно быть связано с вашей обработкой данных JSON. Вы загружаете его из файла, передаете его моему регулярному выражению и анализируете его с помощью json.loads (...), верно? Но тогда у вас есть объект Python, поэтому вам не нужно беспокоиться о кавычках. Если JSONLint жалуется на файлы, которые вы загружаете, это кажется отдельным вопросом.

lhk 13.11.2018 17:36

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