使用Python以编程方式从.accdb文件导出所有表

时间:2019-01-27 05:44:26

标签: python ms-access win32com

我正在尝试将accdb文件中的所有表导出到csv。我正处于可以通过调出表名来导出表的阶段。不幸的是,我需要在成千上万个文件中执行此操作,在这些文件中,我不会提前知道表的名称。

我确定有某种方法可以检索表的名称,然后将其导出。我使用以下代码,通过调出表名“ TableX”来导出表

output = os.path.join(r"C:\Users\user\Desktop", 'Output.csv')
# OPEN ACCESS APP AND DATABASE
oApp = win32com.client.Dispatch("Access.Application")
oApp.OpenCurrentDatabase(accdbfile)

# EXPORT TABLE TO CSV
acExportDelim = 2
oApp.DoCmd.TransferText(TransferType=acExportDelim,
                            SpecificationName=None,
                            TableName="TableX",
                            FileName=output,
                            HasFieldNames=True)
#
oApp.DoCmd.CloseDatabase
oApp.Quit
oApp = None

使用DoCmd命令,我确定有一个命令可以返回所有表的名称,然后我就可以遍历这些表。但不幸的是,我找不到找到这种方法的方法。我知道下面的VBA代码在accdb中可以导出所有表。但不确定如何将其与Python集成

Option Compare Database
Public Sub ExportAll()
Dim obj As AccessObject, dbs As Object
Set dbs = Application.CurrentData
In dbs.AllTables
    If Left(obj.Name, 4) <> "MSys" Then
        DoCmd.TransferText acExportDelim, , obj.Name, _
           Application.CurrentProject.Path & "\" & obj.Name & ".csv", True
        'DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
           obj.Name, Application.CurrentProject.Path & "\" & obj.Name & ".xls", True
    End If
Next obj
End Sub

1 个答案:

答案 0 :(得分:0)

  1. 从MSysObjects表中打开表名的记录集

SELECT [Name] FROM MSysObjects WHERE [Type]=1 AND NOT [Name] LIKE "*Sys*";
那应该限制在您的数据表中,但是我确实在我的数据库中注意到一个奇怪的名字:f_38D36B8B99D54B1DB8E6D145B51ADF90_Data

  1. 然后遍历记录集

  2. 连接TransferText方法中的[名称]字段

或遍历TableDefs集合。有以下帮助吗?

#sample code to list all tables in the selected database
 daoEngine = win32com.client.Dispatch('DAO.DBEngine.36')
 dtbs = daoEngine.OpenDatabase('database_file.mdb')
 for table in dtbs.TableDefs:
 if table.Name[:4] <> "MSys" and table.Name[:4] <> "~TMP":