使用pyodbc读取DBF文件



在一个项目中,我需要从Visual FoxPro数据库中提取数据,该数据库存储在dbf文件中,我有一个包含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文件)也是空的,然后,我认为这是一个权限问题,但所有的文件都有相同的权限结构,所以,我不知道这里发生了什么。

光吗? ?

编辑:

它没有指示输出,它列出的表不是第15个或诸如此类的

我做到了!!!!

我所做的有几个问题,在这里我带着我所做的来解决它(在第一次用Ethan Furman的解决方案实现它之后)

第一件事是驱动程序问题,原来Windows的DBF驱动程序是32位程序,在64位操作系统上运行,所以,我安装了Python-amd64,这是第一个问题,所以我安装了一个32位的Python。

第二个问题是一个库/文件问题,根据这个,VFP> 7中的dbf文件是不同的,所以我的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检查了一下,OK

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

此外,最好在w3c网站

上阅读de ADO文档。

这对我有用。非常感谢那些回复的人

我将使用我自己的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)

表是类似列表的,遍历它返回记录。记录是list-, dict-和obj-类,迭代返回值;除了通过记录进行迭代之外,还可以通过offset(第一个字段的record[0])、使用类似字典的访问(record['some_field'])的字段名或使用obj的字段名来访问单个字段。类attr_access (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)

我知道这不能直接回答你的问题,但可能还是有帮助的。我在使用ODBC和VFP数据库时遇到了很多问题,我发现在可能的情况下,将VFP表视为自由表通常要容易得多。

使用Yusdi Santoso的dbf.py和glob,这里有一些代码打开目录中的每个表并遍历每个记录。

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

最新更新