Сохранение и редактирование Python с помощью Klepto
Итак, мой вопрос довольно конкретный, и я заранее прошу прощения. Я новый программист и пытался разрабатывать самостоятельно с нуля. Это было относительно успешно, только у меня есть одна последняя проблема, которую я вижу. Вы можете просмотреть мой код здесь в полном объеме.
Так что проблема у меня связана с тем, как я сохраняю файл. Сначала я попытался засолить его, так как это словарь, но получал ошибку, потому что мой словарь
(имя, класс) пары.
Я искал здесь и увидел, что могу попробовать JSON сделать то же самое. Закончилось тем же видом ошибок. В конце концов я нашел модуль klepto, который работал. Я успешно сохранил свой словарь и успешно загрузил его. Только позже я обнаружил, что могу добавлять новые элементы в файл, но всякий раз, когда я удаляю что-то из своего файла и сохраняю. В следующий раз я его загружу. Ключ, который я удалил, все еще там.
TLDR: Можно просто добавить все в мой файл dict и сохранить в текстовый файл, но когда я удаляю его из файла и сохраняю, он не сохраняет удаленный ключ.
Во всяком случае, я нахожусь в тупике, где моя проблема заключается в том, как я сохраняю файл или как я его загружаю или оба? Любая помощь будет принята с благодарностью.
Редактировать: Хорошо, я предполагаю, что в настоящее время он настроен на сохранение и загрузку.
try:
alcohols = file_archive('Alcohols.txt')
alcohols.load()
except IOError:
alcohols = {}
print('alcohols doesn\'t exist.')
а также
print('Exiting and saving the data.')
alcohols.dump('Alcohols.txt') #saves the dictionary data as is
Он прекрасно сохраняет словарь при добавлении новых элементов, но, скажем, мне нужно что-то отредактировать и удалить, затем сохранить и выйти. В следующий раз при загрузке в нем будут как старые, так и новые предметы. Как ни странно, я, кажется, что-то сломал во всем моем редактировании. Не сохраняет новые записи.
Edit2:
del alcohols[name] #deletes the key out of the dict
Вот как я удаляю ключи. Первоначально я использовал метод pop, но когда он не сохранил изменения, я попробовал это. Обратите внимание, что он удалял ключ, значение из словаря, но сохранение и перезагрузка не отражали бы это изменение.
alcohols[name] = Alcohol() #instantiates the new class
Вот как я создаю новый ключ, пары значений.
Решено редактировать:
Моя проблема была в том, как я удалил их из словаря. На случай, если кто-нибудь попадет сюда позже. Посмотрите на ответ @Mike Mckerns. Пришлось удалить из архива словарь.
1 ответ
По сути, вы удаляете из кэша "в памяти", а не из "файлового" кэша. klepto
архив по умолчанию дает вам "в памяти" кеш, который вы используете непосредственно через интерфейс dict, а также дает вам archive
который является фоном.
Таким образом, когда вы dump
Вы переносите элементы в памяти на сервер. Чтобы удалить из кэша и из архива, вы должны удалить из обоих.
>>> from klepto.archives import *
>>> arch = file_archive('foo.txt')
>>> arch['a'] = 1
>>> arch['b'] = 2
>>> # look at the "in-memory" copy
>>> arch
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # look at the "on-disk" copy
>>> arch.archive
file_archive('foo.txt', {}, cached=False)
>>> # dump from memory to the file
>>> arch.dump()
>>> arch.archive
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=False)
>>> arch
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # delete from the in-memory cache
>>> arch.pop('a')
1
>>> # delete from the on-disk cache
>>> arch.archive.pop('a')
1
>>> arch
file_archive('foo.txt', {'b': 2}, cached=True)
>>> arch.archive
file_archive('foo.txt', {'b': 2}, cached=False)
Я думаю, я мог бы облегчить удаление из обоих в одном вызове функции...