Работа с базой данных Access на Python на платформе, отличной от Windows (Linux или Mac)

Я хочу получить доступ к данным в базе данных Microsoft Access. У меня есть файлы .accdb и .mdb и вы хотите их прочитать в Python.

Из моих исследований pyodbc можно использовать только на платформе Windows, но я работаю над Mac OS X. Я новичок в Python.

Другой вариант – если я могу экспортировать данные из базы данных в csv, а затем использовать в python.

Любая помощь или начало было бы высоко оценено.

«Из моих исследований pyodbc можно использовать только на платформе Windows»

Не правда. На главной странице pyobbc говорится:

Предварительно скомпилированные двоичные диски предусмотрены для большинства версий Python для Windows и macOS. В других операционных системах [pip install pyodbc] будет построен из источника.

Однако, конечно, верно, что использование ODBC для управления базой данных Access в основном выполняется в Windows. «MDB Tools», наряду с «unixODBC», часто упоминается как способ работы с базами данных Access на платформах, отличных от Windows, но в моем ограниченном опыте я обнаружил, что он действительно просто не работает очень хорошо (когда он работает вообще).

Конечно, вы всегда можете приобрести сторонний драйвер MS Access ODBC для своей платформы, отличной от Windows, но если вы хотите бесплатное решение с открытым исходным кодом, вы можете использовать драйвер JCBC UCanAccess . Это можно сделать двумя способами: Jython и JayDeBeApi .

В обоих случаях вам потребуется загрузить последнюю версию UCanAccess (доступную для загрузки здесь ) и распаковать файл bin.zip в удобное место, чтобы сохранить структуру папок:

ucaFolder.png

(В следующих примерах я распаковал его на ~/Downloads/JDBC/UCanAccess .)

Вариант 1: Jython

Важно . Следующие инструкции предназначены для UCanAccess версии 3.0.5 или новее.

После …

  • установка Jython (через sudo apt-get install jython на Ubuntu) и
  • загружая UCanAccess и распаковывая его, как описано выше

Я создал следующий Jython-скрипт под названием «dbTest.py»

 from com.ziclix.python.sql import zxJDBC jdbc_url = "jdbc:ucanaccess:///home/gord/Documents/test.accdb" username = "" password = "" driver_class = "net.ucanaccess.jdbc.UcanloadDriver" cnxn = zxJDBC.connect(jdbc_url, username, password, driver_class) crsr = cnxn.cursor() crsr.execute("SELECT AgentName FROM Agents") for row in crsr.fetchall(): print row[0] crsr.close() cnxn.close() 

и запускал его со следующим сценарием оболочки

 #!/bin/bash export CLASSPATH=.:/home/gord/Downloads/JDBC/UCanAccess/loader/ucanload.jar jython dbTest.py 

Вариант 2: JayDeBeApi

Вы можете предпочесть этот параметр, если вам нужно работать с Python_3 или предпочитаете работать с CPython. Вы можете установить JayDeBeApi с помощью pip . Если у вас еще нет JRE (Java Runtime Environment), тогда вам это тоже понадобится. (Я использовал sudo apt install default-jre на Ubuntu.)

После того, как необходимые компоненты будут на месте, вы сможете использовать такой код:

 import jaydebeapi ucanaccess_jars = [ "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.2.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.1.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.6.jar", ] classpath = ":".join(ucanaccess_jars) cnxn = jaydebeapi.connect( "net.ucanaccess.jdbc.UcanaccessDriver", "jdbc:ucanaccess:///home/gord/test.accdb;newDatabaseVersion=V2010", ["", ""], classpath ) crsr = cnxn.cursor() try: crsr.execute("DROP TABLE table1") cnxn.commit() except jaydebeapi.DatabaseError as de: if "user lacks privilege or object not found: TABLE1" in str(de): pass else: raise crsr.execute("CREATE TABLE table1 (id COUNTER PRIMARY KEY, fname TEXT(50))") cnxn.commit() crsr.execute("INSERT INTO table1 (fname) VALUES ('Gord')") cnxn.commit() crsr.execute("SELECT * FROM table1") for row in crsr.fetchall(): print(row) crsr.close() cnxn.close() к import jaydebeapi ucanaccess_jars = [ "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.2.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.1.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.6.jar", ] classpath = ":".join(ucanaccess_jars) cnxn = jaydebeapi.connect( "net.ucanaccess.jdbc.UcanaccessDriver", "jdbc:ucanaccess:///home/gord/test.accdb;newDatabaseVersion=V2010", ["", ""], classpath ) crsr = cnxn.cursor() try: crsr.execute("DROP TABLE table1") cnxn.commit() except jaydebeapi.DatabaseError as de: if "user lacks privilege or object not found: TABLE1" in str(de): pass else: raise crsr.execute("CREATE TABLE table1 (id COUNTER PRIMARY KEY, fname TEXT(50))") cnxn.commit() crsr.execute("INSERT INTO table1 (fname) VALUES ('Gord')") cnxn.commit() crsr.execute("SELECT * FROM table1") for row in crsr.fetchall(): print(row) crsr.close() cnxn.close() 

Этот вопрос старый, но в документации говорится:

Самый простой способ установить – использовать pip. Бинарные файлы Windows будут загружены, но другие операционные системы должны будут скомпилироваться из источника.

Так что это должно быть возможно. Также есть пример для Linux-машин.

http://mkleehammer.github.io/pyodbc/#connecting

Но проверьте эту часть в источнике.

https://github.com/mkleehammer/pyodbc/blob/master/tests2/accesstests.py#L630,L636

Он показывает вам, как выглядит строка подключения для файлов MS Access.

В Mac OSx я предпочитаю использовать pandas_access

Из документации:

 import pandas_access as mdb # Listing the tables. for tbl in mdb.list_tables("my.mdb"): print(tbl) # Read a small table. df = pandas_access.read_table("my.mdb", "MyTable") 
  • Как перечислить все функции в модуле Python?
  • Как проверить, находится ли ip в сети в python 2.x?
  • Доступ к атрибутам на литералах работает на всех типах, но не `int`; Зачем?
  • Определите, работает ли Python внутри virtualenv
  • Использование «readlines ()» дважды подряд
  • Как преобразовать список корневых ключей в словарь?
  • Как поместить отдельные метки для участка рассеяния
  • Как отсортировать словарь по значению?
  • Как преобразовать CSV-файл в многострочный JSON?
  • Как возвращать выходные данные функции, отличной от ее печати?
  • Регулярные выражения Python из re-модуля поддерживают границы слов (\ b)?
  • Interesting Posts

    Как запустить Windows, скомпилированную для PowerPC на современных компьютерах PowerPC без набора инструкций,?

    Как объяснить низкий RTT между чрезвычайно длинными (10s) интервалами ping?

    Как найти полное имя хоста текущего компьютера в C (имя хоста и информация о домене)?

    Установка OpenCV 2.4.3 в Visual C ++ 2010 Express

    Скомпилируйте код полностью в памяти с помощью javax.tools.JavaCompiler

    Каково надлежащее использование EventEmitter?

    Почему я не могу выполнять назначение вне метода?

    Какая версия PowerShell поставляется с Windows 7?

    Могут ли 2 пользователя удалённо войти в поле Windows 7 Ultimate одновременно?

    Преобразование формата DateTime с использованием бритвы

    Могу ли я иметь файлы Swift, Objective-C, C и C ++ в одном и том же проекте Xcode?

    Чтение данных, отправленных в форму ASP.Net

    Arm Neon Intrinsics против ручной сборки

    Как импортировать Java-config-class в XML-config, чтобы оба контекста имели компоненты?

    Как поддерживать кодировку UTF-8 в Eclipse

    Давайте будем гением компьютера.