Найти - Пользователи
Полная версия: В чем принципиальная разница между двумя скрипта чтения и записи через shelve ?
Начало » Python для новичков » В чем принципиальная разница между двумя скрипта чтения и записи через shelve ?
1
Acamori
День добрый, пишу небольшую утилитку и для сохранения неких данных использую модуль 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()

Из-за чего это происходит ? Ошибок никаких не возникает.
Rodegast
Пользуйся чем нибудь другим, например можно использовать sqlite. В своё время от shelve у меня остались сугубо негативные впечатления.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB