Уведомления

Группа в Telegram: @pythonsu

#1 Март 1, 2018 09:15:38

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

В чем принципиальная разница между двумя скрипта чтения и записи через shelve ?

День добрый, пишу небольшую утилитку и для сохранения неких данных использую модуль shelve, но столкнулся с проблемкой, что данные не всегда обновляются своевременно.

Пример для наглядности:

 >>>db = shelve.open(os.path.join(user_profiles, 'accounts_db'))
>>>accounts = dict()
>>>for x in db.keys(): accounts[x] = db[x]
>>>db.close()
>>>print(accounts)
{'Max': {'Valuators': {'Insval': {'Comments': {'Comment 1': 'Max comment 1'}}}},
'Den': {'Valuators': {'Insval': {'Comments': {'Comment 1': 'Den comment 1'}}}}}

Дальше я провожу манипуляции с аккаунтами и хочу записать их обратно в базу

 >>>accounts['Max']['Valuators']['Insval']['Comments']['Comment 2'] = 'MAX COMMENT 2'
>>>db = shelve.open(os.path.join(user_profiles, 'accounts_db'))
>>>db['Max']['Valuators']['Insval']['Comments'] = accounts['Max']['Valuators']['Insval']['Comments']
>>>db.close()

И при повторном чтении из файла получаю следующие

 >>>db = shelve.open(os.path.join(user_profiles, 'accounts_db'))
>>>print(db['Max']['Valuators']['Insval']['Comments'])
{'Comment 1': 'Max comment 1'}
>>>db.close()

Значения обновятся только после перезапуска утилиты. Зато вариант ниже, приводит к тому что значения обновляются сразу.

 >>>db = shelve.open(os.path.join(user_profiles, 'accounts_db'))
>>>for x in accounts.keys():
	try: db[x] = accounts[x].rstrip()
	except AttributeError: db[x] = accounts[x]
>>>db.close()
>>>
>>>
>>>db = shelve.open(os.path.join(user_profiles, 'accounts_db'))
>>>print(db['Max']['Valuators']['Insval']['Comments'])
{'Comment 1': 'Max comment 1',
'Comment 2': 'MAX COMMENT 2'}
>>>db.close()

Из-за чего это происходит ? Ошибок никаких не возникает.

Отредактировано Acamori (Март 1, 2018 09:16:10)

Офлайн

#2 Март 1, 2018 13:25:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2846
Репутация: +  186  -
Профиль   Отправить e-mail  

В чем принципиальная разница между двумя скрипта чтения и записи через shelve ?

Пользуйся чем нибудь другим, например можно использовать sqlite. В своё время от shelve у меня остались сугубо негативные впечатления.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version