当我删除架子中的元素时,我还剩下一些数据。我尝试了
pop
、del
和 clear
,但结果是一样的。剩余的数据位于扩展名为 dat 的文件中。所以,即使使用该方法清除后,dat 文件的大小也不是 0Ko。
这就是我尝试过的:
import shelve
test = shelve.open('test')
test['a']=1
#test.pop('a')
#del test['a']
#test.clear()
test.close()
有没有办法彻底删除货架的数据?
您可以通过
del d[key]
从搁置中删除对象,这是正确的方法。但是,当您删除架子中的所有对象时,这意味着存在空字典。因此,您的搁置文件包含腌制的空字典,因此 sile 大小不为 0。
删除搁置中的所有数据与删除文件中的所有数据不同。
显然 shelve 创建了一个数据库文件(至少对我来说)大约 13k,其中没有数据。尝试以下操作:
import os
import shelve
with shelve.open('fnord') as db:
db['color'] = 'blue, no yelloowwwww!'
print(list(db.keys()))
print(os.stat('fnord').st_size)
with shelve.open('fnord') as db:
db.clear()
print(list(db.keys()))
print(os.stat('fnord').st_size)
您会看到您的架子没有钥匙,但它仍然有尺寸。如果您使用十六进制编辑器编辑文件,您会看到有大量数据,但这可能与数据库文件格式有关。
del d[key]
和.pop(key)
似乎都不起作用。
这非常令人不安,因为第一个是在官方文档中,但也许我做错了什么......
两者似乎都只是从“.dir”文件中删除密钥条目,但“.dat”文件将保留所有数据。 (我这里的 Windows 版本是 3.12)
要解决此问题,您可以使用以下行:
shelf_with_orphaned_data=shelve.open('shelf_with_orphaned_data')
shelf_clean=shelve.open('shelf_clean')
for key in shelf_with_orphaned_data.keys():
shelf_clean[key]=shelf_with_orphaned_data[key]