Не может быть определен тип базы данных полки, которая не распознает базу данных

Почему 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 determined его поднял anydbm.pyopen метод.

Я знаю это; использую 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

1 ответ

Как объяснено в вопросе, эта ошибка произошла из-за ошибки, в которой DB, которая не может идентифицировать некоторые новейшие файлы GDB, больше информации об этом отчете об ошибке: https://bugs.python.org/issue13007

Лучшее решение - заставить db определять метод, который загружает полку с помощью gdbm, вместо того, чтобы пытаться угадать 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)
Другие вопросы по тегам