Как лучше всего преобразовать маринованный словарь 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(',')), Конечно, вам нужно знать (или распознавать), какие строки следует анализировать в кортежи.

Эту проблему можно избежать - данные должны храниться другим способом - другим представлением кортежей или другой структурой данных.

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