使用python通過odbc處理*.dbf數據表


轉載請注明出處和鏈接 @rockpine https://www.cnblogs.com/rockpine/p/10823010.html

一、前言

因為工作原因,需要處理多個*.dbf的數據表,單表最大記錄在20萬以上,而自己之前從未接觸過ms visual foxpro和它的命令,雖然現學現用也可以,但是還是想用python執行SQL語句來處理。這就開始了漫漫探索之路,因為也是第一次接觸,探索過程難免有錯,還望各位批評指正。

二、探索歷程

(一)使用第三方庫直接操作*.dbf

這是第一想法,google了一下,發現還是有的,有可用的dbfread、dbf等第三方庫,這兩個庫都安裝使用了,但是有關的文檔和介紹比較簡單,網上找到的資料很少,庫的使用方法和其它方面也有其局限性。

1、dbfread庫

google的時候發現這個庫的口碑還不錯,首先用命令pip install dbfread安裝,馬上寫段測試代碼嘗試便捷性。

源碼地址: https://github.com/olemb/dbfread/

文檔地址:https://dbfread.readthedocs.io/en/latest/

# 打卡*.dbf數據表,輸出所有記錄
from dbfread import DBF table = DBF("test.dbf") for r in table: print(r)

通過查看文檔,可以將dbf數據讀取后轉成其它數據集,如Sqlite, CSV, Pandas等,但是方法都是讀取*.dbf其中的數據,對於數據的處理和變化需要轉換到其它數據表后處理。該庫對於僅僅讀取數據來說是可以滿足的。另外根據資料說明,改庫對於中文的讀取會報錯,注意編碼的變化。

2、dbf庫

該庫相對於dbfread來說,方法較為豐富,同時也支持執行sql語句。

同樣,使用命令pip install dbf安裝,該庫沒有太多官方文檔,看其源碼后,發現很多方法,但是在執行sql語句的時候,代碼內部總是莫名其妙的報錯,雖然可以滿足我對sql語句的使用,但是報錯讓我沒法正常使用,遂尋找新的方法。

pypi鏈接:https://pypi.org/project/dbf/

較早的模塊文檔:https://pythonhosted.org/dbf/,有些方法或屬性在新版的模塊代碼里出現了變化,如sql變為了pql

3、其它的庫

其它能操作*.dbf數據表的第三方庫也有,如pydbf等,大多也是找不到太多的參考資料和文檔,大概跟上面兩個庫差不多,就沒做太多的嘗試,決定放棄使用第三方庫直接與*.dbf數據表進行操作的想法,再去google尋找新的方式。

 (二)使用odbc的方式

ODBC方式在其它編程語言中是很常用與數據庫交互的方法,在放棄第三方庫后,自然這種方式成為了首選,但是在配置ODBC的過程中,也遇到了很多問題。

1、尋找VFODBC驅動

因為今年都是2019年了,距離微軟退出visual fox pro 9 已經過去12年了,距離VF6.0發布已經21年了,微軟已經不再支持VF了。在微軟官網已經不再提供VFODBC的驅動下載了,官方推薦使用OLEDB來替代,我也不熟悉,還是先繼續沿着ODBC的方式探索,有時間再研究OLEDB的方式。

在官網下載不到,就去各個下載站了,其實google一下,還是有的,只是要辨別好真假,別中毒。是個msi文件,直接安裝就可以。

注意:該驅動是32位驅動,微軟也從未發布64位驅動,這是一個坑,后面再細講。

2、配置數據源

我使用的是win7 64位系統,我相信大家也有很多人用的是64位系統。下面以我的win7 旗艦版 64位系統為例,列一下配置數據源的步驟:

(1)打開數據源管理器

這一步也容易出問題,特別注意我們安裝的VFODBC驅動是32位的,數據源的配置在32位和64位系統的位置是不同的,32位系統正常情況下在控制面板下打開“數據源管理”進行配置就可以,但是在64位系統下,需要在C:\Windows\SysWOW64目錄下找到odbcad32.exe程序,直接運行可以配置系統已經安裝的32位ODBC驅動,如果64位系統在控制面板下的“ODBC”管理器配置,是無法配置32位ODBC驅動的,會提示體系不對。

打開ODBC數據源管理器如下所示:

(2)添加系統DSN

選擇系統DSN(關於用戶DSN、系統DSN和文件DSN的區別請google),點擊右側的添加,彈出的窗口可以看到能夠添加的驅動,我們找到“Microsoft FoxPro VFP Driver (*.dbf)”后雙擊,彈出配置窗口如下:

在Data Source Name 中輸入數據源的名稱,如VFP tables,在Database type中選擇“Free Table directory”,關於.dbc和.dbf的區別大家可以查一下,我這里都是*.dbf這類的自由表,我把他們放在同一個目錄下,下一個Path就選擇要處理的*.dbf自由表所在的目錄,options里默認就可以,如果有需要,大家可以把勾選去掉,配置完后點擊OK,就完成了一個數據源的配置。

(3)python與*.dbf 自由表的連接

這里需要安裝一個第三方庫,python適用pyodbc庫來適用odbc的方法與數據表進行連接,不過我安裝的是pypyodbc這個第三方庫,因為這個庫是pyodbc的純python實現,具有更好的移植性,方法和屬性都不變。

使用命令安裝pypyodbc

pip install pypyodbc

 與數據表進行連接,執行SQL語句

import pypyodbc
conStr = r"Driver={Microsoft FoxPro VFP Driver (*.dbf)};SourceType=DBF;SourceDB=E:\TEST;Deleted=Yes;Null=Yes;Collate=Machine;BackgroundFetch=Yes;Exclusive=No"
connection = pypyodbc.connect(conStr)
cursor = connection.cursor()
sql = "select * from test"
rs = cursor.execute(sql)
for r in rs:
    print(r)

 這樣就回到了熟悉的ODBC使用上。

這一步需要特別注意,因為我們下載安裝的VFODBC是32位驅動,我安裝的python的64位版本,剛開始沒太注意,調試了幾個晚上,都沒有成功,總是找不到數據源。后來經過幾番搜索,發現有人說32位的驅動沒法使用64位的python來運行,死馬當活馬醫的心態,更換python版本。

神奇的是,更換成python的32位版本后,上述代碼一次運行成功,困擾了好多天的問題終於算是解決了。

 

經過各種周折,終於可以暢快的使用odbc來處理*.dbf的數據表了,有錯誤望大家批評指正和交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM