Python dbfpy和FoxP

2024-05-13 06:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我使用的是一种古老的数据库格式,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'

下面是我返回错误的简单代码:

^{pr2}$

就像我说的,我可以加载没有问题的其他文件,但也许有一个解决这个特定错误的方法?在

EDIT:我还想指出,可以在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的人都应该被烧死。在


Tags: 文件inpyself数据库libpackages错误
3条回答

可能是这样项目.dbf使用其他dbf没有的更高级的dbf功能。例如,自动递增整数的引入很晚,大多数odbc驱动程序都不支持它。在

您应该看看Sybase的Advantage Database Server。这个产品对VFP DBF文件有很好的支持。我已经通过pyodbc将他们的ODBC驱动程序与Python一起使用了几年,并且使用他们最近发布的一个与DB-api2.0兼容的Python driver获得了非常好的结果。在

我也被置于必须支持DBF表的位置。Advantage数据库服务器是绝对的救星。在

回溯是dbfpy告诉您文件中有一个dbfpy不支持的字段类型代码0。这是一个visualfoxpro(“VFP”)的东西。在

这和备忘录文件无关。是的,如果有备注字段,则它们存储在.FPT文件中。^当您访问foo.dbf时,{}需要出现。在

你说“我最终使用了python dBase模块”。。。假设您指的是ethanfurman的dbf模块,根据它的PyPI entry不支持空字段。在

我有一个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。如果你想要这个模块的副本,请找到我的电子邮件地址,例如google(“john machin xlrd”)给我发电子邮件,我会把它发给你。在

相关问题 更多 >