如果我尝试打开刚刚由shelve创建的文件,为什么搁置会引发错误?
import shelve
info_file_name = "/Users/bacon/myproject/temp/test.info"
info_file = shelve.open(info_file_name)
info_file['ok'] = 'wass'
info_file.close()
info_file = shelve.open(info_file_name) # raise exception db type could not be determined..
info_file.close()
我正在运行python 2.5,以防相关
提出的确切错误是:
db type could not be determined
由anydbm.py
open
方法提出。
我知道;使用gdbm。我检查了whichdb.py文件,它尝试用这个
识别gdbm文件 # Read the start of the file -- the magic number
s16 = f.read(16)
s = s16[0:4]
# Convert to 4-byte int in native byte order -- return "" if impossible
(magic,) = struct.unpack("=l", s)
# Check for GNU dbm
if magic == 0x13579ace:
return "gdbm"
但我文件中的“魔术”号码是324508367
(0x13579acf
)(只有最后一位数字更改!! )
我尝试用另一种语言(ruby)打开文件,我能够毫无问题地打开它,所以这似乎是db.py尝试识别正确的dbm的错误
答案 0 :(得分:2)
正如在问题上所解释的那样,这个错误是由于db无法识别某些最新的gdb文件的错误,有关此错误报告的更多信息:https://bugs.python.org/issue13007
最好的解决方案是强制db定义一个用gdbm加载shelve的方法,而不是试图猜测dbm。
def gdbm_shelve(filename, flag="c"):
mod = __import__("gdbm")
return shelve.Shelf(mod.open(filename, flag))
然后使用它代替shelve.open
:
info_file = gdbm_shelve(info_file_name)