搁置给出KeyError和“无法将项目添加到数据库”

时间:2019-01-19 16:29:32

标签: python pickle shelve

我的以下代码:

shelve_object = shelve.open('data/shelve_data', writeback=True)
print([key for key in shelve_object])
for key in shelve_object:
    print(shelve_object[key])

提供以下输出:

['251784238314029058', '259650808973492225', '493076669914152965', '525293044375879690', '272814395237859330']

Traceback (most recent call last):
  File "/usr/lib/python3.6/shelve.py", line 111, in __getitem__
    value = self.cache[key]
KeyError: '251784238314029058'

我还在日志中注意到以下错误:

  File "/usr/lib/python3.6/shelve.py", line 113, in __getitem__
    f = BytesIO(self.dict[key.encode(self.keyencoding)])
_dbm.error
  File "/usr/lib/python3.6/shelve.py", line 125, in __setitem__
    self.dict[key.encode(self.keyencoding)] = f.getvalue()
_dbm.error: cannot add item to database

搁置如何返回似乎不存在的键?

1 个答案:

答案 0 :(得分:1)

支持您搁置的dbm文件已损坏,或者文件与用于搁置文件的dbm后端库之间存在某种不兼容。

shelvedbm module支持,并且确切地取决于您的操作系统使用的是哪种特定实现,但是一般来说dbm文件是磁盘{{3} },该数据结构使用稀疏表结构来稍后再次有效地查找键。

要向您显示文件中的所有密钥,dbm库将在表上进行扫描,并在找到一个非空插槽时为您提供每个密钥。但是要找到给定键的值,它会<哈希>键以得到一个介于零和表的最大大小之间的数字,查看表中的相应行并获得值

这两种技术之间存在差异;您似乎在表中错误位置中有键。很难说是怎么回事,这可能是文件损坏改变了簿记,并且实际表大小不同于簿记信息应有的大小。可能是您更换了机器,而哈希实现现在是错误的。还是别的什么,对不起,我们真的不能帮忙。