Python dbfpy 与 FoxPro
我这里在用一种很老旧的数据库格式,叫做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 个回答
你可以看看Sybase的Advantage Database Server。这个产品对VFP的DBF文件支持得非常好。我已经用他们的ODBC驱动和Python通过pyodbc配合了好几年,效果一直很不错,最近他们还发布了一个符合DB-API 2.0标准的Python驱动。
我也曾经遇到过需要支持DBF表的情况,Advantage Database Server真的是帮了我大忙。
可能是item.dbf使用了一些更高级的dbf功能,而其他的dbf文件没有这些功能。例如,自动递增的整数这个特性很晚才被引入,而且大多数的odbc驱动程序都不支持它。
你的错误信息是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”——发邮件给我,我会把它发给你。