在一个项目中,我需要从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文件)是空的那么,我认为这是一个权限问题,但所有文件都有相同的权限结构,所以,我不知道这里发生了什么。
任何亮点?
修改 它没有说明输出,它列出的表不是第一个或类似的
答案 0 :(得分:10)
我知道!!!!
我在这里遇到了几个问题,在这里,我带来了解决它的问题(在第一次用Ethan Furman的解决方案实现之后)
第一件事是驱动程序问题,事实证明Windows的DBF驱动程序是32位程序并在64位操作系统上运行,因此,我安装了Python-amd64,这是第一个问题,所以我安装了32位Python。
第二个问题是库/文件问题,根据this,VFP中的dbf文件> 7是不同的,所以我的pyodbc库将无法正确读取它们,所以我尝试了一些OLE-DB库但没有成功,我决定从头开始。
谷歌搜索了一段时间,带我去this帖子,最后给了我一个关于这个的消息基本上,我所做的是以下内容:
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 extensions(32位)和Visual FoxPro OLE-DB Provider(仅适用于32位),在我的情况下是VFP 9.0
此外,最好在w3c网站上阅读de ADO Documentation
这对我有用。非常感谢那些回复
的人答案 1 :(得分: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
答案 2 :(得分:2)
我会使用自己的dbf package,代码会像这样:
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]
),字段名称使用类似dict的访问(record['some_field']
)或使用obj的字段名来访问各个字段。 .attr-like 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)