Как лучше всего преобразовать маринованный словарь Python, используя библиотеку полок Python (bsddb), в файл JSON, имеющий значения кортежей для ключей словаря
У меня есть приложение, в котором мне нужно преобразовать файлы словаря Python с полками в JSON-файлы.
import ujson, shelve
with open("shelveFile", "r") as sfile:
shelve_dict=shelve.open(sfile)
py_dict= dict(shelve_dict)
with open("jsonfile.json","w") as jsonfile:
ujson.dump(py_dict, jsonfile)
with open("jsonfile.json",'r') as readJSONfile:
ujson.loads(readJSONfile.read())
Примечание: если я использую ujson.load(jsonfile2)
Я получаю ошибку сериализации.
У меня есть проблема: файл shelve использует типы данных кортежа Python для некоторых ключей словаря. Я могу использовать ujson.dump
сохранить как JSON, но когда я пытаюсь использовать ujson.load(jsonfile)
ключи загружаются в виде строк, а не кортежей. Если не использовать словарное понимание для преобразования ключей (неуверенный в этом точном синтаксисе), есть ли библиотека, которая преобразует файл полок в файл JSON, который я мог бы загрузить обратно в объект словаря Python?
При загрузке ujson.loads(fileobj.read())
метод:
{"('tuplekey1','tuplekey2')": value,}
Должно быть:
{('tuplekey1','tuplekey2'): value,}
(пожалуйста, не голосуйте, если вопрос не ясен, я сделаю все возможное, чтобы уточнить, если это необходимо... Я не часто публикую вопросы здесь.)
1 ответ
Кортежи нельзя использовать в качестве словарных ключей, если вы хотите сохранить данные с shelve
или же json
, Так что в вашем случае строковое представление кортежей было использовано вместо реальных кортежей - repr(('tuplekey1', 'tuplekey2'))
дает "('tuplekey1', 'tuplekey2')"
,
Так что вам нужен дополнительный шаг для разбора строк в кортежи. Например, eval("('tuplekey1', 'tuplekey2')")
или же tuple(val.strip("()' ") for val in a.split(','))
, Конечно, вам нужно знать (или распознавать), какие строки следует анализировать в кортежи.
Эту проблему можно избежать - данные должны храниться другим способом - другим представлением кортежей или другой структурой данных.