使用Python 2.7.2上的搁置标准库,我编写了一个非常简单的测试来创建一个持久数据文件,然后立即打开它进行打印:
import os
import shelve
shelf_filename = str(__file__.split('.')[0] + '.dat')
#delete the shelf file if it exists already.
try:
os.remove(shelf_filename)
print "DELETED LEFTOVER SHELF FILE", shelf_filename
except OSError:
pass
#create a new shelf, write some data, and flush it to disk
shelf_handle = shelve.open(shelf_filename)
print "OPENED", shelf_filename, "WITH SHELF"
shelf_handle['foo'] = 'bar'
shelf_handle.close()
print "FLUSHED AND CLOSED THE SHELF"
#re-open the shelf we just wrote, read/print the data, and close it
shelf_handle = shelve.open(shelf_filename)
print "RE-OPENED", shelf_filename, "WITH SHELF"
print 'foo:', shelf_handle.get('foo')
shelf_handle.close()
#delete the shelf file
os.remove(shelf_filename)
但是,当该脚本尝试重新打开刚创建的架子时,该脚本意外失败:
DELETED LEFTOVER SHELF FILE shelve_test.dat
OPENED shelve_test.dat WITH SHELF
FLUSHED AND CLOSED THE SHELF
Traceback (most recent call last):
File "shelve_test.py", line 21, in <module>
shelf_handle = shelve.open(shelf_filename)
File ".../shelve.py", line 239, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File ".../shelve.py", line 223, in __init__
Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
File ".../anydbm.py", line 82, in open
raise error, "db type could not be determined"
anydbm.error: db type could not be determined
这是关于搁置的最基本的可能用法,所以我真的不明白我错过了什么,而AFAIK我正在关注文件。请稍微搁置经验的人请告诉我发生了什么事?
更新:这个脚本显然适用于某些平台,而不适用于其他平台,这对于Python标准库来说确实令人惊讶。肯定证实这不起作用:
Python 2.7.2 (default, May 15 2013, 13:46:05)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
答案 0 :(得分:2)
此版本的Python搁置使用的是不推荐使用的dbm软件包,可以通过指定不同的dbm来解决此问题,如下所示:
import anydbm
anydbm._defaultmod = __import__('dumbdbm')
如果将这两行添加到上面的脚本中,那么一切都按预期工作。这真的需要在搁置中修复。
答案 1 :(得分:1)
shelve
不希望您在文件名上指定扩展名。相反,它根据使用哪个db来创建文件,为文件提供扩展名。
因此,当您调用shelve.open("shelve_test.dat")
时,您正在创建一个shelve
期望使用dumbdbm
创建的文件,而是使用不同的(更好的)数据库管理器创建的文件。 / p>
相反,您应该调用shelve.open("shelve_test")
,shelve
可以选择使用正确的扩展名保存文件。这在打开已创建的文件时也适用。