起因:因为工作需要,需要读取dbf文件和系统数据中数据进行校对,因为知道dbf文件可以用sql查询,所以想能不能像mysql/oracle那样连接,再调用执行sql方法,通过一系列百度,尝试,最终通过oledb连接上了dbf数据库
网上有两种:一种是通过odbc,要求安装Microsoft FoxPro VFP Driver(*.dbf)驱动,这个驱动只有32位的,要求python是32位的,安装第三方库pypyodbc,还需要配置数据源,不知道是不是操作系统也需要32位,最后我是没有弄出来,执行代码一直显示没有驱动,代码如下:
# encoding=utf-8
import pypyodbc
conStr= r"Driver={Microsoft FoxPro VFP Driver(*.dbf)};SourceType=DBF;SourceDB=(这里填写dbf文件路径);Deleted=Yes;Null=Yes;Collate=Machine;BackgroundFetch=Yes;Exclusive=No;"
connection=pypyodbc.connect('Driver={Microsoft dBase Driver(*.dbf)}')
cursor=connection.cursor()
sql= "select * from dbf文件名"
rs=cursor.execute(sql)
for r in rs:
print(r)
第二种使用oledb连接:要求python32位,python中需要装第三方库pywin32,然后就是需要安装vfpoledb.exe这个驱动,代码如下:
import win32com.client
#下面三行解决python2中执行程序后报UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
import sys
reload(sys)
sys.setdefaultencoding('utf8')
conn = win32com.client.Dispatch('ADODB.Connection')
db = '这里设置dbf文件路径'
dsn = 'Provider=VFPOLEDB.1;Data Source=%s' % db
conn.Open(dsn)
cmd = win32com.client.Dispatch('ADODB.Command')
cmd.ActiveConnection = conn
cmd.CommandText ="Select * from dbf文件名称;"
rs, total = cmd.Execute() # This returns a tuple: (, number_of_records)
while total:
for x in xrange(rs.Fields.Count):
print '%s --> %s' % (rs.Fields.item(x).Name, rs.Fields.item(x).Value)
rs.MoveNext() #<- Extra indent
total = total - 1
print res_str