dbm.error:无法确定数据库类型

时间:2019-07-02 02:02:35

标签: python

我安装了Python 3.7.3,无论使用哪个版本,我都无法正确运行该模块。这是我最新的错误消息。我这个问题已经出现了好几个星期了,甚至我的老师都没有理解这个错误。

Traceback (most recent call last):
  File "C:\Users\wimme\AppData\Local\Programs\Python\Python37\lib\shelve.py", line 243, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "C:\Users\wimme\AppData\Local\Programs\Python\Python37\lib\shelve.py", line 227, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "C:\Users\wimme\AppData\Local\Programs\Python\Python37\lib\dbm\__init__.py", line 88, in open
    raise error[0]("db type could not be determined")
dbm.error: db type could not be determined

这是我文件的源代码。

import shelve
import pickle

scores_file = shelve.open('scores.txt', 'c')


name = input('Input student name (-999 to quit):')

while name != '-999':


    if (name in scores_file):
        print('This name has already been entered')

    else:
        score = eval(input('Input student score:'))
        scores_file[name]=score
        print()
    name = input('Input student name (-999 to quit):')


print(scores_file)
scores_file.sync()

want_name = input("Do you want to search for a student score? (yes or no)")

while want_name == 'yes':
    #print(scores_file.keys())
    print(list(scores_file.keys()))
    search_name = input("Which student's score would you like to know?")
    print(search_name in scores_file)
    if search_name in scores_file:
         print(search_name , "scored a" , scores_file[search_name])
    else:
         print("This student's score is not in this list")

    want_name = input("Do you want to search for another student score? (yes or no)")

scores_file.close()

1 个答案:

答案 0 :(得分:0)

这是python库问题,而不是IDE问题。

回溯丢失了发生错误的代码行。请阅读https://stackoverflow.com/help/minimal-reproducible-example。如果以下答案不正确,则在将来,请删除多余的碎片。我怀疑只需要import shelveshelve.open

在具有相同参数的Win 10机器上,两者均可正常运行,创建一个DbfilenameShelf对象。对我来说,scores.txt以前不存在。我相信它一定适合您。

从第88行开始读取dbm.py,dbm.whichdb(file)必须返回''。反过来,这意味着whichdb代码中的所有检查(以返回其他内容)均失败了。特别是,scores.txt必须已经存在,因此以下行151-154不会返回None。

    try:
        f = io.open(filename, "rb")
    except OSError:
        return None

这时,文件看起来不像GNU dbm,并且已经检查了dumbdbm,因此返回了”。

因此,除非您已经有一个数据库,否则请使用不存在的名称。禁用.txt,因为dumbdbm将创建filename.dat和filename.dir。 shelve.open文档说:“指定的文件名是基础数据库的基本文件名。副作用是,可能在文件名中添加了扩展名,并且可能创建了多个文件。”