【问题标题】:Import MDB file into Python (pandas) on Mac在 Mac 上将 MDB 文件导入 Python (pandas)
【发布时间】:2019-09-11 20:57:07
【问题描述】:

我在 Mac 上运行 python 3.6。我已经下载了一个 mdb 文件,但没有 Microsoft 访问权限,我想将每个表导入 python 并在那里使用它。

我已安装 mdbtools 并从 Spyder 运行以下命令:

import pandas as pd
import subprocess
import os

os.chdir('<directory where mdb file is>')

def show_tables(path='avroll_19.mdb'):
    tables = subprocess.check_output(["mdb-tables", path])
    return tables.decode().split()

show_tables()

我收到此错误:FileNotFoundError: [Errno 2] No such file or directory: 'mdb-tables': 'mdb-tables'

我也试过这个,但得到同样的错误:

import pandas_access as mdb
for tbl in mdb.list_tables('avroll_19.mdb'):
    print(tbl)

我在 Anaconda 中使用 Sypder,我不确定这是否是个问题。

mdb 文件位于:https://www1.nyc.gov/assets/finance/downloads/tar/avroll_20.zip

我也尝试使用 pyodbc 执行此操作,但是,它所需的驱动程序似乎不适用于 mac。

感谢您的帮助。

【问题讨论】:

  • 对于第一个块:访问文件不是可执行文件,因此不清楚您在那里尝试什么。对于第二个块:您是否更改了工作路径?
  • 第一个块正在尝试获取 mdb 文件中的表的名称。其次,mdb 文件位于 os.chdir 所引用的目录中。
  • 我看到mdb-tables 是一个可执行文件。从来没有听说过。 pandas_access 看起来是一个较旧的维护模块。我建议让 Windows 朋友/同事从数据库文件中提取所需的数据。

标签: python pandas ms-access mdbtools


【解决方案1】:

我刚刚确认以下方法适用于当前版本的pandasJayDeBeApiUCanAccess JDBC 驱动程序。有关如何设置 Java/UCanAccess 环境的更多详细信息,请参阅this answer

import jaydebeapi
import pandas as pd

db_path = "/home/gord/UCanAccessTest.accdb"

ucanaccess_jars = [
    "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-5.0.0.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang3-3.8.1.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.2.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb-2.5.0.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-3.0.1.jar",
]
classpath = ":".join(ucanaccess_jars)
cnxn = jaydebeapi.connect(
    "net.ucanaccess.jdbc.UcanaccessDriver",
    f"jdbc:ucanaccess://{db_path}",
    ["", ""],
    classpath,
)

df = pd.read_sql_query("SELECT * FROM Clients", cnxn)
print(df)
"""console output:
   ID      LastName FirstName                  DOB
0   1      Thompson      Gord  2017-04-01 07:06:27
1   2        Loblaw       Bob  1996-09-12 16:03:00
"""

请注意,这适用于读取从 Access 到 pandas 但适用于使用 to_sql 写回 Access。

【讨论】:

  • +1。今天开始搜索如何在 pandas 中读取 .mdb 文件,我只能找到您的答案 Gord!我很幸运,所以我必须说。安装了 UCanAccess 有点费力,然后就像 pip install jaydebeapi 一样简单。
【解决方案2】:

我有一个使用 R 而不是 Python 的解决方法。我参考了这方面的材料 发帖:https://medium.com/@wenyu.z/reading-ms-access-mdb-files-on-mac-969a176baa7a.

首先,在终端运行:brew install mdbtools。请注意,这要求已安装自制软件。

其次,在 R 中运行:

library(Hmisc)
data <- mdb.get('avroll_19.mdb')

当然,用您的数据库文件名替换 avroll_19.mdb。

【讨论】:

    【解决方案3】:

    我也收到相同的文件未找到错误。 这是因为我的访问数据源是旧的 32 位 .mdb,而我的 python 是 64 位。

    它在 32 位机器上工作

    【讨论】:

      【解决方案4】:

      我让 pandas_access 在this 线程之后工作。问题是 Python 要求 Windows 运行 mdb-tables.exe,但它没有找到。修复很简单:

      • 下载存储在this github 上的 mdbtools-win 可执行文件
      • 将包含可执行文件的文件夹添加到 Windows PATH

      然后神奇地 pandas_access.read_table 开始在 Python 中工作:

      之前:

      IPdb [13]: pandas_access.read_table('Database.accdb', "Table"])
      *** FileNotFoundError: [WinError 2] The system cannot find the file specified
      

      之后:

      IPdb [14]: pandas_access.read_table('Database.accdb', "Table"])
            ID      Table
      0      1         A
      1      2         B
      2      3         S
      3      4         X
      4      5         Z
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-08-17
        • 1970-01-01
        • 2020-10-08
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多