修复损坏的货架缓存

fix corrupted shelve cache

我创建的搁置不允许我在没有以下失败的情况下访问密钥。

x = shelve.open('my_shelve.pkl') x.keys()

bsddb.db.DBPageNotFoundError: (-30986, 'BDB0075 DB_PAGE_NOTFOUND: Requested page not found')

但是,我可以检查 Shelf 是否包含这样的密钥:

'some-key' in x,

此外,货架将 return 正确的数据

x['some-key']

我在其他地方没有密钥列表,所以我想以某种方式检索密钥以便检索数据,或者以其他方式解决数据库问题。

我正在使用 Python 2.7.6

当数据库文件损坏时(例如,可能是因为过去调用 close 失败),您可能无法恢复其 all内容(文件格式没有足够的冗余来支持它)。

但是,您也许可以按如下方式恢复其中的 部分

recov = {}
try:
    for k in x:
        recov[k] = x[k]
except Exception:
    pass

无法预测您可以通过这种方式恢复多少键(和相关值),但至少不要求 all 键(正如我想象的那样您正在使用 x.keys() -- 您没有告诉我们您使用的是哪个 Python 版本,但我猜它是 2.something) 您也许可以恢复 其中一些...