Как сделать файл полки пустым в python?

Я создал файл полки и вставил данные словаря. Теперь я хочу очистить этот файл полки, чтобы повторно использовать его как чистый файл.

import shelve
dict = shelve.open("Sample.db")
# insert some data into sample.db
dict = { "foo" : "bar"}

#Now I want to clean entire shelve file to re-insert the data from begining.

person Abhishek Kulkarni    schedule 27.06.2013    source источник
comment
Почему бы просто не удалить файл?   -  person Lev Levitsky    schedule 27.06.2013
comment
Обратите внимание, что dict = { "foo" : "bar"} должно быть dict["foo"] = "bar". Как и сейчас, он не вставляет данные в объект полки — вместо этого он указывает dict на новый объект словаря, оставляя полку без изменений.   -  person george    schedule 07.02.2017


Ответы (6)


Shelve ведет себя как словарь, таким образом:

dict.clear()

Кроме того, вы всегда можете удалить файл и позволить отложить создание нового.

person Dima Tisnek    schedule 27.06.2013
comment
Модулю shelve разрешено добавлять элементы к имени файла, которое вы ему даете, и на моей машине он фактически создает пару файлов. Очистка словаря кажется проще, поскольку она позволяет избежать вопроса о том, какой файл или файлы удалить. - person kuzzooroo; 03.10.2016
comment
Самое простое объяснение. Спасибо - person aditya rawat; 29.05.2018

dict.clear() является самым простым и должен быть действительным, но, похоже, на самом деле не очищает полочные файлы (Python 3.5.2, 64-разрядная версия Windows 7). Например, размер файла полки .dat увеличивается каждый раз, когда я запускаю следующий фрагмент, в то время как я ожидаю, что он всегда будет иметь одинаковый размер:

shelf = shelve.open('shelf')
shelf.clear()
shelf['0'] = list(range(10000))
shelf.close()

Обновление: dbm.dumb, которое shelve использует в качестве базовой базы данных под Windows, содержит этот элемент TODO в своем коде:

  • освободить свободное пространство (в настоящее время пространство, занимаемое удаленными или расширенными элементами, никогда не используется повторно)

Это объясняет постоянно растущую проблему полочных файлов.


Поэтому вместо dict.clear() я использую shelve.open с flag='n'. Цитирование shelve.open() документации:

Необязательный параметр флага имеет ту же интерпретацию, что и параметр флага в dbm.open().

И dbm.open() документация для flag='n':

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

Если полка уже открыта, использование будет:

shelf.close()
shelf = shelve.open('shelf', flag='n')
person george    schedule 07.02.2017

ни один из них на самом деле не работает. В итоге я создал функцию для обработки удаления файла.

import shelve
import pyperclip
import sys
import os

mcbShelf = shelve.open('mcb')
command = sys.argv[1].lower()

def remove_files():
    mcbShelf.close()
    os.remove('mcb.dat')
    os.remove('mcb.bak')
    os.remove('mcb.dir')

if command == 'save':
    mcbShelf[sys.argv[2]] = pyperclip.paste()
elif command == 'list':
    pyperclip.copy(", ".join(mcbShelf.keys()))
elif command == 'del':
    remove_files()
else:
    pyperclip.copy(mcbShelf[sys.argv[1]])

mcbShelf.close()
person Will Meyers    schedule 02.04.2017
comment
Это также сработало бы: # Удалить все ключевые слова (ключ в mcbShelf) elif sys.argv[1].lower() == 'delete': for keyword in list(mcbShelf.keys()): del mcbShelf[keyword ] - person Jacob Helfman; 02.06.2020

Вы также можете использовать цикл for для удаления контента с полки:

for key in shelf.keys():
            del shelf[key]
person sarah.andromeda315    schedule 11.12.2020

Я думаю, это то, что вы ищете.

if os.path.isfile(mcbShelf):
   os.remove(mcbShelf)
person AndreasSoul    schedule 01.06.2020
comment
удалить файл или очистить файл? - person Ulf Gjerdingen; 12.05.2021

Я думаю, это то, что вы ищете.

del dict["foo"]
person Professor Hex    schedule 03.02.2015