如何使用 Python 读取 Berkeley DB 文件?

Posted

技术标签:

【中文标题】如何使用 Python 读取 Berkeley DB 文件?【英文标题】:How do I read Berkeley DB files with Python? 【发布时间】:2014-04-08 20:04:41 【问题描述】:

我有这个文件...

    [root@dhcp-idev1 ndb]# file dhcp.ndb 
    dhcp.ndb: Berkeley DB (Btree, version 9, native byte-order)

...所以我想我可以做到...

    [root@dhcp-idev1 ndb]# python2.3 
    Python 2.3.4 (#1, Jul 16 2009, 07:01:37) 
    [GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import anydbm
    >>> anydbm.open( './dhcp.ndb' )

...但我收到此错误消息...

    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "/usr/lib/python2.3/anydbm.py", line 80, in open
        raise error, "db type could not be determined"
    anydbm.error: db type could not be determined
    >>> 

...我做错了什么?

【问题讨论】:

您是否尝试过直接使用dbm.opengdbm.opendbhash.open?此外,dbm 后端在给定文件名中添加了.db 扩展名,因此请尝试将文件重命名为dhcp.db 并使用dbm.open('dhcp') 打开它。 【参考方案1】:

这是与此错误相关的代码来自anydbm.py

from whichdb import whichdb
  result=whichdb(file)
  if result is None:
     # db doesn't exist
     if 'c' in flag or 'n' in flag:
        # file doesn't exist and the new
        # flag was used so use default type
        mod = _defaultmod
     else:
        raise error, "need 'c' or 'n' flag to open new db"
  elif result == "":
     # db type cannot be determined
     raise error, "db type could not be determined"

如果whichdb 可以打开文件但无法确定要使用的库,则返回空字符串。

所以问题是为什么它无法确定库。可能是未安装打开此数据库文件所需的库。

 anydbm is a generic interface to variants of the DBM database — dbhash (requires 
 bsddb), gdbm, or dbm. If none of these modules is installed, the slow-but-simple
 implementation in module dumbdbm will be used.

所以要么你缺少dumbdbm 模块(导入它并使用它而不是anydbm),要么你需要安装其他库dbhash gdbm, dbm 来打开文件。

【讨论】:

感谢您的回答! AFAIK 我安装了dumbdb dumbdbm 应该在 python 2.X 中。只需尝试使用dumbdbm.open( './dhcp.ndb' )。对于 python 3.X 使用 dbm.dumb.open(filename) 。不要忘记import dumbdbm 感谢 Arvind &gt;&gt;&gt; import dumbdbm &gt;&gt;&gt; dumbdbm.open( './dhcp.ndb' )

以上是关于如何使用 Python 读取 Berkeley DB 文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Berkeley DB(bsddb 模块)、Python

关于 recv 和读取缓冲区 - C Berkeley Sockets

使用 Berkeley DB、C++ STL 接口进行批量读取

如何在不安装的情况下在应用程序中使用 Berkeley DB

如何检测 TCP 套接字断开连接(使用 C Berkeley 套接字)

Java Berkeley DB 是不是有并发读取的上限?