无法确定搁置数据库类型,哪个db无法识别gdb

时间:2016-03-03 12:08:00

标签: python shelve

如果我尝试打开刚刚由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 determinedanydbm.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"

但我文件中的“魔术”号码是3245083670x13579acf)(只有最后一位数字更改!!

我尝试用另一种语言(ruby)打开文件,我能够毫无问题地打开它,所以这似乎是db.py尝试识别正确的dbm的错误

1 个答案:

答案 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)