修复损坏的货架缓存
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) 您也许可以恢复 其中一些...
我创建的搁置不允许我在没有以下失败的情况下访问密钥。
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) 您也许可以恢复 其中一些...