我试图在Python中制作一个简单的密码存储程序,看起来很简单,所以我想知道我是否使用了错误的搁置。
我有主.py文件:
import shelve
passwords = shelve.open('./passwords_dict.py')
choice = raw_input("Add password (a) or choose site (c)?")
if choice[0] == 'a':
site_key = raw_input("Add for which site? ").lower()
userpass = raw_input("Add any info such as username, email, or passwords: ")
passwords[site_key] = userpass
else:
site = raw_input("Which site? ").lower()
if site in passwords:
print "Info for " + site + ": " + passwords[site]
else:
print site, "doesn't seem to exist!"
print "Done!"
passwords.close()
另一个文件password_dict .py只是一个空字典。
但是当我尝试运行程序时,我得到这个错误:
Traceback (most recent call last):
File "passwords.py", line 3, in <module>
passwords = shelve.open('passwords_dict.py')
File "/usr/lib/python2.7/shelve.py", line 239, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/lib/python2.7/shelve.py", line 223, in __init__
Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
File "/usr/lib/python2.7/anydbm.py", line 82, in open
raise error, "db type could not be determined"
anydbm.error: db type could not be determined
当我尝试使用anydbm时,我得到这个错误:
Traceback (most recent call last):
File "passwords.py", line 3, in <module>
passwords = anydbm.open('passwords_dict.py')
File "/usr/lib/python2.7/anydbm.py", line 82, in open
raise error, "db type could not be determined"
anydbm.error: db type could not be determined
当我尝试使用dbm时,我得到这个错误:
Traceback (most recent call last):
File "passwords.py", line 3, in <module>
passwords = dbm.open('./passwords_dict.py')
dbm.error: (2, 'No such file or directory')
我做错了什么?是否有另一种方法来存储字典,并且仍然能够使用用户输入提取键(而不是整个字典,我认为这是pickle所做的)?
我想你误解了架子模块的工作原理。它打开一个数据库文件。当您尝试打开包含Python脚本的现有文件时,它会尝试检测该文件包含的数据库类型(因为shelve支持多个后端数据库)。
我想你应该这样写:
import os
import shelve
curdir = os.path.dirname(__file__)
passwords = shelve.open(os.path.join(curdir, 'password_db'))
这将在与脚本相同的目录下创建一个名为password_db.<db>
的新文件,其中<db>
是特定于实现的数据库文件扩展名。
我也遇到过这个问题。这似乎与shelve.open
的filename
论点的未记录条件有关。它目前是非常不透明的(例如shelve.open("/tmp/tmphTTQLda")
工作,而shelve.open("/tmp/tmphTTQLd")
不能)。变量文件名的失败和成功很难预测。我要求在http://bugs.python.org/issue23174以文档增强的形式给出解释。
在我的情况下,打开shelve
之外的持久字典并将其传递给shelve.Shelve
工作,例如代码
a = dumbdbm.open(tempfile.mkstemp()[1])
b = shelve.Shelf(dict=a)
和b
做你已经做了shelve.open
的返回值
anydb https://bugs.python.org/issue13007有一个错误,无法对gdbm
文件使用正确的标识。
因此,如果您试图使用shelve打开一个有效的gdbm文件并抛出该错误,请使用以下命令:
mod = __import__("gdbm")
file = shelve.Shelf(mod.open(filename, flag))
关于这个问题的更多信息:shelve db type could not determined, whichdb is not recognize gdb