Жонглирование с заменами, конечно, запутанный путь -
язык имеет встроенные парсеры для этого вида экранирования -
более простой из которых будет передача строки, содержащей JSON, через вызов eval
. Но eval редко требуется, и его следует избегать в большинстве случаев как «не элегантный» - если не совсем небезопасный (но будучи небезопасным, на самом деле применяется только тогда, когда у вас нет контроля над входными данными - и даже ими, ast.literal_eval
вместо простых eval
может смягчить это). В любом случае, есть другие проблемы с форматом, которые не позволят eval работать напрямую - например, пропущенные кавычки data:
.
Случайные ранты друг от друга, если содержимое вашего файла на самом деле:
data:{\"data\":[\"Kendrick\",\"Lamar\"]}\n\ndata:{\"data\":[\"David\",\"Bowie\"]}\n\n
У него есть две проблемы: "занижение" из самых крайних data
и
«переброс» внутренних данных.
В интерактивном сеансе Python, используя маркер «необработанная строка», я могу ввести строку примера, так как она будет прочитана из файла:
In [263]: a = r"""data:{\"data\":[\"Kendrick\",\"Lamar\"]}\n\ndata:{\"data\":[\"David\",\"Bowie\"]}\n\n"""
In [264]: print(a)
data:{\"data\":[\"Kendrick\",\"Lamar\"]}\n\ndata:{\"data\":[\"David\",\"Bowie\"]}\n\n
Итак, для удаления одного уровня обратной косой черты - в Python есть кодировка текста "unicode_escape", но она работает только с байтами-объектами. Затем мы прибегаем к кодировке «latin1», поскольку она обеспечивает побайтное преобразование литерала Юникода в «a» в байты, а затем применяем unicode_escape для удаления «\»:
In [266]: b = a.encode("latin1").decode("unicode_escape")
In [267]: print(b, "\n", repr(b))
data:{"data":["Kendrick","Lamar"]}
data:{"data":["David","Bowie"]}
'data:{"data":["Kendrick","Lamar"]}\n\ndata:{"data":["David","Bowie"]}\n\n'
теперь легко разобрать:
Мы разделяем полученную строку на "\ n \ n" и получаем один список с одной записью
(те, которые вы называете "набор данных") для каждого элемента. Тогда мы прибегаем к струне
манипуляции, чтобы избавиться от начального "data:"
и, наконец, json.load
может работать на оставшуюся часть.
так:
import json
raw_data = open("mystrangefile.pseudo_json").read()
data = data.encode("latin1").decode("unicode_escape")
records = [json.loads(record.split(":", 1)[-1]) for record in data.split("\n\n")]
И "записи" теперь должны содержать словари объектов Python с хорошим поведением, которые вы можете поместить в базу данных. (Если Pandas не может обеспечить автоматическое сопоставление столбцов с базами данных, этот шаг кажется ненужным - необработанного connection.executemany(""" INSERT ...""", records)
с надлежащим открытым подключением к БД должно быть достаточно.
Кроме того, в сообщении, которое вы упомянули, вы можете легко справиться с этим с помощью десериализатора .NET: это только в том случае, если ваши файлы не так повреждены, как вы показали нам, - ни один из возможных стандартных сериализаторов не может знать, как обрабатывать такие специфические ошибки. формат данных из коробки. Но, если вы на самом деле более эффективны в этом на другом языке / технологии, вы можете просто написать конвертер из сломанного ввода в правильно закодированный файл и использовать его в качестве промежуточного шага.