Я пытаюсь сгладить 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
Я думаю, что у меня проблема, но было бы лучше, если бы вы поместили несколько примеров, таких как входной файл json, фактический результат и ожидаемый результат :)
Извините, ребята, это мой первый пост, я добавил код, который использую, спасибо






Итак, образец файла будет выглядеть так?
{
"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 неправильных пробелов между двумя фигурными скобками, любое решение о том, как решить эту проблему, пожалуйста?
Привет, @lhk, образец файла на самом деле выглядит так: {"temp": 1} {"temp": 2} Как будто конец фигурной скобки temp 1 и начало фигурной скобки temp 2 находятся на одной строке, а не в другой строке, я надеюсь, что эта информация имеет значение, поскольку код все еще не работает.
Это странно. Если я возьму ваш образец (из вашего комментария, скобки в той же строке) и вставлю его в свой код, он будет работать нормально. Вы можете проверить это, заменив часть загрузки файла на text = '{"temp": 1} {"temp": 2}'. Вы скопировали мой точный код?
Да, он работает, но происходят две вещи: 1) Двойные кавычки «Ключ»: «Значение» преобразуются в одинарные кавычки «Ключ»: «Значение» 2) Я пытаюсь проверить с помощью JsonLint, он показывает ошибка: ожидая 'STRING', '}', получил 'undefined', который я искал в Google, и кто-то из StackOverflow упомянул, что "строковые литералы JSON должны использовать обычные кавычки ("), а не умные кавычки ("") ", но после запуска код, 1) происходит !!
Я не понимаю, что ты делаешь. Мой код не заменяет кавычки, поэтому это должно быть связано с вашей обработкой данных JSON. Вы загружаете его из файла, передаете его моему регулярному выражению и анализируете его с помощью json.loads (...), верно? Но тогда у вас есть объект Python, поэтому вам не нужно беспокоиться о кавычках. Если JSONLint жалуется на файлы, которые вы загружаете, это кажется отдельным вопросом.
Вы можете показать пример кода? Вам будет легче помочь.