我使用的是Python搁置模块和以下Python版本:CCD_ 1。shelve.open方法的标志参数如下所述:
可选标志参数与dbm.open().的标志参数具有相同的解释
dbm标志参数描述如下:
'n'总是创建一个新的空数据库,打开以读取和写入
但以下程序并没有像我预期的那样工作:
导入搁置导入操作系统导入os.path进口百叶窗myshelvedir='C:\\testdir'myshelvefile=os.path.join(myshelvedir,'myshelve')os.mkdir(myshelvedir)尝试:myshelve=shelve.open(myshelvefile)尝试:myshelve['key1']='value1'打印(1,dict(myshelve))最后:myshelve.close()myshelve=shelve.open(myshelvefile,'n')尝试:myshelve['key2']='value2'打印(2,dict(myshelve))最后:myshelve.close()最后:shutil.rmtree(myshelvedir)
输出为
1{"key1":"value1"}2{'key1':'value1','key2':'value2'}
对于第二行,我预计
2{"key2":"value2"}
因为搁置是用CCD_ 2标志打开的,因此数据库在打开后应该是空的。
我错过什么了吗?
附加测试:
关于
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on win32
我也有
2 {'key2': 'value2', 'key1': 'value1'}
关于
Python 2.6.4 (r264:75706, Jun 27 2012, 05:45:50) [C] on sunos5
我得到了预期的
(2, {'key2': 'value2'})
也在Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win 32
我得到
(2, {'key2': 'value2'})
因此,这是3 中的一个新功能或错误
我找到了http://bugs.python.org/issue18039.
标题:dbm.open(…,flag="n")不工作,并且不会发出警告
这给出了一个解释。
文档中说shelve使用了一个可用的数据库接口。
http://docs.python.org/3/library/shelve.html
1.3.shelve--Python对象持久性
…
搁置打开(文件名,标志='c',协议=无,写回=假)
打开一本持久词典
…
可选标志参数与dbm.open()的标志参数具有相同的解释。
…
12.3.1.限制将使用哪个数据库包(如dbm.dbm或dbm.gnu)取决于可用的接口。因此,直接使用dbm打开数据库是不安全的。
并且'n'标志的工作方式与dbm.open
类似
http://docs.python.org/3/library/dbm.html
12.5.dbm--Unix"数据库"的接口
dbm是dbm数据库变体dbm.gnu或dbm.nddm的通用接口。如果没有安装这些模块,则将使用模块dbm.dunb中缓慢但简单的实现
…
'n':始终创建一个新的空数据库,打开以读取和写入
但是,如果n标志回到dbms.dumb ,则n标志的定义与n标志的含义相矛盾
http://docs.python.org/3/library/dbm.html#module-dbm.gnu
12.5.1.dbm.gnu——gnu对dbm的重新解释
平台:Unix
http://docs.python.org/3/library/dbm.html#module-dbm.dumb说
12.5.3.dbm.dumb--可移植dbm实现
…
dbm.dumm.open(filename[,flag[,mode]])。。。可选标志参数当前被忽略;数据库总是打开以进行更新,如果数据库不存在,则会创建该数据库。
因此,在安装了gnu.dbm库的Unix实现中,这可能不是一个问题(我无法访问Unix上的python 3来测试这一点)
由此,我得出结论,python文档中存在一些相互矛盾的语句:在安装了dbm库的unix系统上,python shelve将使用此dbm安装,此处的"n"标志如文档中所述工作。
如果找不到dbm安装(例如在windows系统上),则在"n"与"c"标志类似的位置将使用dbm.dumb模块。