我创建了一个搁置文件并插入了一个字典数据。现在我想清理那个搁置文件以重用为干净文件。
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.
答案 0 :(得分:11)
Shelve的行为就像字典一样,因此:
dict.clear()
或者,您可以随时删除该文件,并让搁置创建一个新文件。
答案 1 :(得分:2)
dict.clear()
是最简单的,应该是有效的,但似乎并没有真正清除架子文件(Python 3.5.2,Windows 7 64位)。例如,每次运行以下代码段时,货架.dat
文件大小都会增加,而我希望它总是具有相同的大小:
shelf = shelve.open('shelf')
shelf.clear()
shelf['0'] = list(range(10000))
shelf.close()
更新: dbm.dumb
,shelve
在Windows下用作其基础数据库,包含此TODO项目in its code:
- 回收可用空间(目前,曾经被删除或扩展的项目占用的空间永远不会被重用)
这解释了不断增长的货架文件问题。
因此,我dict.clear()
使用shelve.open
而不是flag='n'
。引用shelve.open()
documentation:
可选标志参数与标志具有相同的解释 dbm.open()的参数。
flag='n'
的{{3}}:
始终创建一个新的空数据库,打开以供阅读和编写
如果货架已经打开,则使用情况为:
shelf.close()
shelf = shelve.open('shelf', flag='n')
答案 2 :(得分:0)
这些都不起作用我最终做的是创建一个处理文件删除的函数。
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()
答案 3 :(得分:0)
我认为这就是您想要的。
if os.path.isfile(mcbShelf):
os.remove(mcbShelf)
答案 4 :(得分:0)
您还可以使用for循环从架子上删除内容:
for key in shelf.keys():
del shelf[key]
答案 5 :(得分:-1)
我认为这就是你要找的东西。
del dict["foo"]