Как эффективно очистить файл DBM в Python?

В модуле DBM есть команда для удаления значения, хранящегося в ключе.

del d[key]      # delete data stored at key (raises KeyError   # if no such key)

Но я даже не могу выполнить итерацию с помощью этой команды, потому что возникает ошибка времени выполнения (RuntimeError: словарь изменил размер во время итерации.)

import dbm
db=dbm.open("file.db","c")
for key in db:
    del db[key]
print(len(db))
db.close()

Есть ли эффективный способ сразу очистить файл DMB? Я использую Python 3.3


person Sashko Kopyl    schedule 20.05.2013    source источник


Ответы (1)


for key in list(db):
    del db[key]

должно сработать.

EDIT: Если цель состоит в том, чтобы просто полностью очистить базу данных, вы также можете закрыть базу данных и снова открыть ее с помощью dbm.open('filename', 'n'). Флаг 'n' означает «Всегда создавать новую, пустую базу данных, открытую для чтения и записи»; кажется, что он переопределяет любой ранее существовавший файл.

person Armin Rigo    schedule 20.05.2013
comment
Спасибо, это работает! Есть ли решения без итерации? Удаление файлов с помощью OS.REMOVE также является вариантом, но DMB создал 2 файла. Разве нет умного способа, такого как DBM.CLEAR() или что-то в этом роде? - person Sashko Kopyl; 20.05.2013
comment
Я пробовал это с флагом n, но это не переопределяет файл. ››› db=dbm.open(db,c) ››› db[line]=(somedata) ››› db.close() ››› db=dbm.open(db,n) ››› data= db[line] ››› print(data) b'somedata' ››› db.close() - person Sashko Kopyl; 21.05.2013
comment
Странно, у меня так (Python 2.7.3 на 32-битном Linux). - person Armin Rigo; 22.05.2013
comment
Возможно, это проблема версии Python. Я использую 32-разрядную версию Python 3.3.2 в Windows7. Если флаг n не переопределяет файл, в нем нет необходимости, поскольку с флагом c можно создать новый файл. - person Sashko Kopyl; 22.05.2013
comment
А, нашел. Он действительно скрыт в документах :-( В Windows он будет использовать это: docs.python.org/3/library/dbm.html#module-dbm.dumb, который документирует свой флаг как игнорируемый. Я бы все равно отправил отчет об ошибке на вашем месте, говоря, что либо документы по адресу docs.python.org/3/library/dbm.html# dbm.open должен содержать предупреждение, или следует исправить работу с dumpdbm. - person Armin Rigo; 22.05.2013
comment
Понимаю. В этом случае. Спасибо! - person Sashko Kopyl; 23.05.2013