如何从可能损坏或过大的Python Shelve数据库中恢复数据?

时间:2014-12-04 12:45:59

标签: python shelve

我一直在使用Shelve作为文档存储。 键是一个字符串化的整数,值只是字符串中的一些html。不幸的是,我的脚本最终在数据库中放入了很多错误发生的条目(我没有确切的问题)。 db的大小约为36GB,现在当我加载它然后尝试迭代键或类似的东西时,我得到以下错误......

import shelve

db = shelve.open("my.shelf")
ks = db.keys()
for k in ks: print(k)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_collections_abc.py", line 482, in __iter__
    yield from self._mapping
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 95, in __iter__
    for k in self.dict.keys():
SystemError: Negative size passed to PyBytes_FromStringAndSize

>>> list(ks.__dict__.values())[0].dict
<_dbm.dbm object at 0x10037ef90>
>>> help(list(ks.__dict__.values())[0].dict)

>>> list(ks.__dict__.values())[0].dict.keys()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: Negative size passed to PyBytes_FromStringAndSize

这是在OSX Yosemite上。 Python 3.4

是否可以修复此问题或获取密钥和值以便放置在更合适的商店中?

1 个答案:

答案 0 :(得分:0)

您必须知道已成功存储相应对象的密钥名称。

因为保存数据对象失败会损坏您的数据库。

然后,

db = shelve.open("my.shelf") for key in list_of_successfully_saved_obj's_name: val = db.get(key) ...