使用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的数据表了,有错误望大家批评指正和交流。

转载于:https://www.cnblogs.com/rockpine/p/10823010.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值