2011-03-11 152 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一直是絕對的救星。