Python dbfpy 与 FoxPro

5 投票
4 回答
4245 浏览
提问于 2025-04-16 13:31

我这里在用一种很老旧的数据库格式,叫做dbf文件。别问我为什么,只知道有个软件决定支持foxpro,因为微软也决定支持foxpro。现在,我在处理一个特定的文件时遇到了一个错误。我已经成功加载了另一个文件,所以我想知道这个数据库是不是有什么问题。我知道你们可能需要查看这个数据库才能判断,但它太大了,没法发上来,所以我只能尽量提供我能得到的信息。

Traceback (most recent call last):
  File "billsapi.py", line 250, in <module>
    x.getUsedGuns()
  File "billsapi.py", line 72, in getUsedGuns
    itemdb = dbf.Dbf('item.dbf', readOnly=True, ignoreErrors=True)
  File "C:\Python27\lib\site-packages\dbfpy\dbf.py", line 135, in __init__
    self.header = self.HeaderClass.fromStream(self.stream)
  File "C:\Python27\lib\site-packages\dbfpy\header.py", line 127, in fromStream
    _fld = fields.lookupFor(_data[11]).fromString(_data, _pos)
  File "C:\Python27\lib\site-packages\dbfpy\fields.py", line 455, in lookupFor
    return _fieldsRegistry[typeCode]
KeyError: '0'

这是我简单的代码,结果返回了这个错误:

def getUsedGuns(self): 
    itemdb = dbf.Dbf('item.dbf', readOnly=True, ignoreErrors=True) 

就像我说的,我可以顺利加载其他文件,但也许有办法解决这个特定的错误?

补充:我还想指出,这个文件可以在DBF View Plus中打开、查看和修改。

4 个回答

0

你可以看看Sybase的Advantage Database Server。这个产品对VFP的DBF文件支持得非常好。我已经用他们的ODBC驱动和Python通过pyodbc配合了好几年,效果一直很不错,最近他们还发布了一个符合DB-API 2.0标准的Python驱动

我也曾经遇到过需要支持DBF表的情况,Advantage Database Server真的是帮了我大忙。

0

可能是item.dbf使用了一些更高级的dbf功能,而其他的dbf文件没有这些功能。例如,自动递增的整数这个特性很晚才被引入,而且大多数的odbc驱动程序都不支持它。

2

你的错误信息是dbfpy在告诉你,你的文件里有一个dbfpy不支持的字段类型代码,0。这是一个Visual FoxPro(简称“VFP”)的问题。

这和备忘录文件没有关系。是的,如果有备忘录字段,它们会存储在一个.FPT文件里。也就是说,当你访问foo.dbf时,foo.fpt文件必须存在。

你提到“我最后使用了python dBase模块”...你可能是指Ethan Furman的dbf模块,根据它在PyPI上的介绍,这个模块不支持空字段。

我有一个读取DBF文件的模块(pydbfrw),我一直打算“哪天”发布。以下是它文档中的一段:

Field Type      Description  DBF variety  Python 2.x type
0 (digit zero)  _NullFlags   VFP          N/A             

Notes: This field type is used only for the hidden _NullFlags field which
is a bit mask saying which fields in the record should be interpreted as NULL.

我的模块能够识别这种情况,并在需要时返回None作为字段值。如果你想要这个模块的副本,可以找到我的电子邮件地址——比如在谷歌上搜索“john machin xlrd”——发邮件给我,我会把它发给你。

撰写回答