Reading DBF files with pyodbc

发布于 2021-01-29 14:09:47

In a project, I need to extract data from a Visual FoxPro database, which is
stored in dbf files, y have a data directory with 539 files I need to take
into account, each file represents a database table, so I’ve been doing some
testing and my code goes like this:

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 _

this prints only 15 tables, with no obvious pattern, always the same 15
tables, I thought this was because the rest of the tables were empty but I
checked and it some of the tables (dbf files) on the list are empty too, then,
I thought it was a permission issue, but all the files have the same
permission structure, so, I don’t know what’s happening here.

Any light??

EDIT: It is not truccating the output, the tables it list are not the 15
first or anything like that

关注者
0
被浏览
239
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    I DID IT!!!!

    There where several problems with what I was doing so, here I come with what I
    did to solve it (after implementing it the first time with Ethan Furman’s
    solution)

    The first thing was a driver problem, it turns out that the Windows’ DBF
    drivers are 32 bits programs and runs on a 64 bits operating system, so, I had
    installed Python-amd64 and that was the first problem, so I installed a 32bit
    Python.

    The second issue was a library/file issue, according to
    this,
    dbf files in VFP > 7 are diferent, so my pyodbc library won’t read them
    correctly, so I tried some OLE-DB libraries with no success and I decided to
    to it from scratch.

    Googling for a while took me to
    this
    post which finally gave me a light on this

    Basically, what I did was the following:

    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
    

    And it gave me 20 records which I checked with DBFCommander and were OK

    First, you need to install pywin32
    extensions
    (32bits)
    and the Visual FoxPro OLE-DB Provider (only available for 32bits), in my case for
    VFP 9.0

    Also, it’s good to read de ADO
    Documentation
    at the w3c website

    This worked for me. Thank you very much to those who replied



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看