Как лучше всего преобразовать маринованный словарь Python, используя библиотеку полок Python (bsddb), в файл JSON, имеющий значения кортежей для ключей словаря - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть приложение, в котором мне нужно конвертировать файлы со словарем в формате 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 Ответ

0 голосов
/ 19 декабря 2018

Кортежи нельзя использовать в качестве ключей словаря, если вы хотите сохранить данные с shelve или json.Таким образом, в вашем случае строковое представление кортежей использовалось вместо реальных кортежей - repr(('tuplekey1', 'tuplekey2')) дает "('tuplekey1', 'tuplekey2')".

Так что вам нужен дополнительный шаг для разбора строк в кортежи.Например, eval("('tuplekey1', 'tuplekey2')") или tuple(val.strip("()' ") for val in a.split(',')).Конечно, вам нужно знать (или распознавать), какие строки следует анализировать в кортежи.

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

...