Программно экспортируйте все таблицы из файла .accdb с помощью Python.

Я пытаюсь экспортировать все таблицы в файле 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

person Alexander    schedule 27.01.2019    source источник


Ответы (1)


  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":
person June7    schedule 27.01.2019
comment
Когда я пытаюсь реализовать TableDefs, я получаю следующее: AttributeError: 'NoneType' object has no attribute 'TableDefs. Не уверен, почему я не могу получить доступ к таблицам. Кроме того, можете ли вы уточнить, что вы имели в виду, открывая набор записей имен таблиц в MSyObject - person Alexander; 27.01.2019
comment
MSysObjects — это скрытая системная таблица, в которой перечислены имена объектов в БД. Если вы хотите просмотреть скрытые таблицы, щелкните правой кнопкой мыши заголовок панели навигации > Параметры навигации > установите флажок Показать системные объекты. Код Python был найден и не проверен. - person June7; 27.01.2019