Reading DBF files with pyodbc

后端 未结 3 405
梦如初夏
梦如初夏 2020-12-18 08:00

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 fi

3条回答
  •  甜味超标
    2020-12-18 08:17

    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: (, 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

提交回复
热议问题