2011-03-11 105 views
4

好的,我在这里使用了古老的数据库格式,dbf文件。不要问为什么,只知道某个软件决定扩展foxpro支持,因为微软决定扩展foxpro支持。现在,我在特定的文件上收到以下错误。我已经成功加载了另一个文件,我很好奇这个数据库是否有问题。我相信你可能需要查看数据库来确定,但它的方式是巨大的发布,所以我会采取我能得到的。Python dbfpy和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中打开并查看和修改。

编辑:找到解决方案。我实际上最终使用了python dBase模块。我认为我的主要问题是没有备忘录文件(无论它们是什么,它有.fpt文件扩展名)。下面是我现在使用的:

from dbf.tables import VfpTable 
itemdb = VfpTable('item.db') 
for rec in itemdb: 
    print rec['MY_COLUM_NAME'] 

我还想指出,目前仍在使用FoxPro的人应该被烧掉。

+0

您使用的是什么版本的dbfpy? – 2011-03-11 18:46:48

+0

它的版本2.2.5与Python 2。7 – 2011-03-11 19:12:39

+0

供参考:备注文件包含任何其列声明MEMO类型的字段。备注列可以存储非常大的任意长度的字符串。由于普通表文件('* .dbf')包含固定宽度的记录,所以备注字段不太适合。因此,他们以自己的格式获得自己的文件。 – 2011-03-11 21:24:11

回答

2

您的回溯是dbfpy的方式,告诉您您的文件具有不受支持的dbfpy字段类型代码0。这是一个Visual FoxPro(“VFP”)的东西。

这与备忘录文件无关。是的,如果有备忘录字段,则它们存储在.FPT文件中。当您访问foo.dbf时需要存在foo.fpt

你说“”“我实际上结束了使用python dBase模块”“”......大概你的意思是Ethan Furman的dbf模块,根据它的​​不支持空字段。

我有一个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”) - 给我发电子邮件,我会发给你。

+0

+1感谢您对备忘录文件的更正。 – 2011-03-21 18:09:49

0

可能是item.dbf使用更高级的dbf功能,而其他dbf不能。例如,自动增量整数很晚才引入,大多数odbc驱动程序都不支持。

+0

嗯所以我的dbfpy python模块不能读取这些文件,我运气不好? – 2011-03-11 18:21:48

0

您应该看看Sybase的Advantage Database Server。该产品对VFP DBF文件有出色的支持。我通过pyodbc使用他们的ODBC驱动程序已有几年时间,并且使用他们最近发布的符合DB-API 2.0的Python driver的优秀结果。

我也被放在必须支持DBF表的位置。 Advantage Database Server一直是绝对的救星。