转载请注明出处和链接 @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

使用python通过odbc处理*.dbf数据表相关推荐

  1. 用Python做数据分析之生成数据表

    第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导入. 获取外部数据 ...

  2. python删除列_python删掉数据表几列的方法

    1.使用del函数删除指定列 python 中针对DataFrame格式的数据,删除列最简单的方法是使用del 函数,简单粗暴效果好,如import pandas as pd df = pd.Data ...

  3. python和表格关系_数据表之多表关联

    一.表关系 请创建如下表,并创建相关约束 /*Navicat Premium Data Transfer Source Server : localhost Source Server Type : ...

  4. 如何解决打开一个DBF数据表时出现的“Index not Found…”错误(摘)

    http://huzi2010.blog.163.com/blog/static/468742432010621132902/?1309176474 转载于:https://www.cnblogs.c ...

  5. Python使用SQLAlchemy连接数据库并创建数据表、插入数据、删除数据、更新表、查询表(CRUD)

    Python使用SQLAlchemy连接数据库并创建数据表.插入数据.删除数据.更新表.查询表(CRUD) 目录 Python使用SQLAlchemy连接数据库并创建数据表 #SQLAlchemy # ...

  6. python使用pandas基于时间条件查询多个oracle数据表

    python使用pandas基于时间条件查询多个oracle数据表 目录 python使用pandas基于时间条件查询多个orcale数据表 #orcale数据连接

  7. python读取第二行_使用Python操作Excel(二):读取数据表

    上一节我们提到,使用openpyxl可以方便的对数据表进行操作,例如:抽象Excel数据并存入数据库 将数据库数据导出到Excel 给一个已存在的数据表追加信息 我们还介绍了一些Excel的基本术语, ...

  8. python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...

    当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...

  9. 对比excel,用python绘制柱状图时添加table数据表

    最近在做数据可视化的时候,希望在图上同时显示数据表.关于这个需求,用excel可以比较方便,直接快速布局中选择布局5即可.那么,如果我们想用python也来完成这项任务,可以怎么做呢? 期望效果预览: ...

最新文章

  1. golang http 操作 简介
  2. 关于qt学习的一点小记录(1)
  3. 【Linux】13_ 文件查找
  4. 【征稿进行时】计算机与智能控制主题征稿,ICCEIC 2020持续征稿中!
  5. windchill 可交付成果 文档_敏捷等于没有文档吗?敏捷项目管理VS传统项目管理区别在哪里?...
  6. (转)base64编码(严格说来,base64不算作加解密算法)
  7. DevExperience(1801)
  8. 2015Cocos游戏开发大赛作品——人鱼塞壬
  9. Android自定义控件学习(四)------创建一个视图类
  10. Nginx 实现封杀恶意访问
  11. 超级浏览器究竟是什么?
  12. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序
  13. win10 干净卸载anaconda
  14. 树莓派4B配置远程桌面软件 Teamviewer(解决报错)
  15. 0506-铁矿石跌5%,美股大跌
  16. ggradar画雷达图
  17. 如何查看Mac系统的位数
  18. Tableau基础 | 维度、度量、蓝色、绿色
  19. 行情平淡期做市商如何刷量 说一个网格策略魔改高频刷单策略的思路
  20. 内盘外盘新手看热闹,老手在内盘外盘看门道

热门文章

  1. istio入门与实战 pdf 下载_Istio入门与实战
  2. python import _ssl_如何在python 2.7.6中导入_ssl?
  3. css 类别选择器 并集,CSS常用选择器
  4. win10搭建Linux子系统,win10中搭建Linux子系统
  5. linux 多块硬盘 snmp,[技术干货] Zabbix使用snmp监控Linux硬盘大小不准问题
  6. 充电枪cp信号控制板_新能源汽车充电头气密性检测是怎么做的呢?
  7. 「 iOS知识小集 」2018 · 第 38 期
  8. 探索服务设计的深层定义
  9. eclipse或Myeclipse中web项目没有run on server时怎么办?
  10. dockerfile 创建Jenkins镜像