6

在一个项目中,我需要从一个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 文件)也是空的,然后,我以为是权限问题,但是所有文件都有相同的权限结构,所以,我不知道这里发生了什么。

有光吗??

编辑: 它没有截断输出,它列出的表不是第 15 个或类似的表

4

3 回答 3

10

我做到了!!!!

我正在做的事情有几个问题,在这里我提出了我为解决它所做的事情(在第一次使用 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 检查了这些记录,一切正常

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

此外,最好阅读w3c 网站上的de ADO 文档

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

于 2012-12-26T20:57:10.370 回答
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)

一个表是类似列表的,通过它迭代返回记录。记录是list-、dict-和obj-like,迭代返回值;除了遍历记录之外,单个字段可以通过偏移量(record[0]对于第一个字段)、使用类字典访问(record['some_field'])的字段名或使用类 obj.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)
于 2012-12-21T23:33:14.323 回答
2

我知道这并不能直接回答您的问题,但可能仍会有所帮助。我在使用 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
于 2012-12-21T17:51:18.403 回答