2015-09-09 172 views
0

我創建的擱架不允許我在沒有以下故障的情況下訪問密鑰。修復損壞的擱置緩存

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

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

但是,我能夠檢查保質包含像這樣的關鍵:

'some-key' in x

,另外,該架將返回正確的數據與

x['some-key']

我沒有在其他地方的密鑰列表,所以我想以某種方式檢索密鑰,以便我可以檢索數據,或以其他方式解決數據庫的問題。

我使用Python 2.7.6

回答

1

當數據庫文件損壞(例如,也許是沒有在打電話過去close就可以了),你可能無法收回所有其內容(文件格式只是沒有足夠的冗餘來支持)。

然而,你也許可以恢復它的部分如下:

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

這是不可能預測你會多少個鍵(和關聯值)能夠恢復這種方式,但在最少不要求所有鍵(因爲我想你正在用x.keys()做 - 你不會告訴我們你正在使用哪個Python版本,但我想它是2.something)你可能能夠恢復其中一些 ...

+0

我使用的是Python 2.7.6,但是我無法用這個恢復任何內容(即使進入循環體之前它也會失敗) – eqzx

+1

然後嘗試使用稍微不同的邏輯在Python 3.4中恢復某些數據。如果這也完全失敗了,那麼這表明你的文件損壞太大,不能讓你恢復任何東西。 –