-->

读DBF文件与pyodbc(Reading DBF files with pyodbc)

2019-07-17 12:28发布

在一个项目中,我需要从一个Visual FoxPro数据库,存储在DBF文件中提取数据,Y与539页的文件,我需要考虑到数据目录中,每个文件代表一个数据库表,所以我一直在做一些测试和我的代码是这样的:

import pyodbc

connection = pyodbc.connect("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=P:\\Data;Exclusive=No;Collate=Machine;NULL=No;DELETED=Yes")
tables = connection.cursor().tables()
for _ in tables:
    print _

这种打印仅15表,而没有明显的模式,总是相同的15个表,我认为这是因为表的其余部分是空的,但我检查,它的一些名单上的表(DBF文件)都是空太,然后,我认为这是一个权限问题,但所有的文件具有相同的权限结构,所以,我不知道这里发生了什么。

任何光??

编辑:这是不是truccating输出,表其名单是不是15首或类似的东西

Answer 1:

我做的!!!!

这里有几个问题,我在做什么,所以,我在这里跟我做了什么来解决这个问题(实现了第一次和Ethan Furman的解决方案后)

的第一件事是一个驱动程序的问题,事实证明,Windows的DBF驱动程序是32个程序,并运行在64位操作系统上,所以,我已经安装了Python的AMD64,那是第一个问题,所以我安装了一个32位蟒蛇。

第二个问题是库/文件问题,根据这个 ,DBF文件在VFP> 7 diferent,所以我pyodbc库将无法正确读取它们,所以我尝试了一些OLE-DB库,但没有成功,我决定向它从头开始。

谷歌搜索了一会儿带我到这个帖子里面终于给了我这个光

基本上,我所做的是以下几点:

import win32com.client

conn = win32com.client.Dispatch('ADODB.Connection')
db = 'C:\\Profit\\profit_a\\ARMM'
dsn = 'Provider=VFPOLEDB.1;Data Source=%s' % db
conn.Open(dsn)

cmd = win32com.client.Dispatch('ADODB.Command')
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from factura, reng_fac where factura.fact_num = reng_fac.fact_num AND factura.fact_num = 6099;"

rs, total = cmd.Execute() # This returns a tuple: (<RecordSet>, 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

它给了我20个记录我与DBFCommander检查,并分别确定

首先,您需要安装pywin32扩展 (32位)和Visual FoxPro中的OLE DB提供程序 (仅适用于32位),在我的情况下VFP 9.0

此外,这是很好的读解ADO文档在W3C网站

这为我工作。 非常感谢那些谁回答



Answer 2:

我知道这并不直接回答你的问题,但仍可能有帮助。 我有很多使用ODBC数据库VFP问题,我发现它往往更容易处理的VFP表作为免费表时可能。

使用Yusdi桑托索的dbf.py和水珠,这里的一些代码在目录中打开每个表,并通过每个记录运行。

import glob
import os
import dbf

os.chdir("P:\\data")
for file in glob.glob("*.dbf"):
    table = dbf.readDbf(file)
    for row in table:
         #do stuff


Answer 3:

我会用我自己的DBF包和代码会去是这样的:

import dbf
from glob import glob

for dbf_file in glob(r'p:\data\*.dbf'):
    with dbf.Table(dbf_file) as table:
        for record in table:
            do_something_with(record)

表是列表等,通过迭代返回记录。 记录是列表 - ,dict-,以及OBJ-等,并且迭代返回值; 除了通过记录一次迭代中,个别字段可以通过偏移(被访问record[0]用于第一场),通过使用类似字典的访问字段名( record['some_field']或通过字段名使用物镜.attr状访问( record.some_field )。

如果你只是想每个内容转储dbf文件转换成csv文件,你可以这样做:

for dbf_file in glob(r'p:\data\*.dbf'):
    with dbf.Table(dbf_file) as table:
        dbf.export(table, dbf_file)


文章来源: Reading DBF files with pyodbc