I hit a funny bug with the Python shelve module. I’d write a shelf database, then try to open it again and get this error:
db = shelve.open('foo.db') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/shelve.py", line 243, in open return DbfilenameShelf(filename, flag, protocol, writeback) File "/usr/lib/python3.6/shelve.py", line 227, in __init__ Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback) File "/usr/lib/python3.6/dbm/__init__.py", line 88, in open raise error("db type could not be determined") dbm.error: db type could not be determined
Turns out this is my mistake. I created the shelf with code like this:
db = shelve.open('foo')
This creates a file named foo.db, a Berkeley DB file. And then I tried to open it:
db = shelve.open('foo.db')
See the error? The shelve module is appending the .db for me; I shouldn’t have added it myself to the filename. Simple enough mistake I made, confusing error results. It’d be nicer if the code threw an error or opened a new database file named foo.db.db, but instead you get this confusing error.
Python 3.6.3 on Ubuntu 16.04, which I think is libdb 5.3.
Note this error is different from an often-referenced bug in older Pythons not recognizing GDBM databases consistently (issue 13007).