如何将大型Pandas DataFrame写入.accdb?遇IM002驱动错误求解决
解决Pandas写入MS Access数据库的IM002驱动错误
以下是针对你遇到的驱动未找到错误的排查和解决步骤:
1. 强制匹配Python与Access驱动的位数
这是最常见的触发原因:64位Python必须搭配64位Access ODBC驱动,32位Python搭配32位驱动,二者不能交叉混用。
- 检查Python位数:运行以下代码确认
import sys print(sys.maxsize > 2**32) # 输出True为64位,False为32位 - 对应位数打开ODBC数据源管理器:
- 64位:打开
C:\Windows\System32\odbcad32.exe - 32位:打开
C:\Windows\SysWOW64\odbcad32.exe
- 64位:打开
- 在「驱动程序」标签下确认存在
Microsoft Access Driver (*.mdb, *.accdb),且位数与Python完全一致。如果缺失,安装对应位数的Access Runtime或Office驱动包。
2. 严格匹配驱动名称
不同版本的Office/Access驱动名称可能存在细微差异,必须完全照搬ODBC管理器中显示的精确名称:
- 比如旧版驱动名称可能是
{Microsoft Access Driver (*.mdb)},新版为{Microsoft Access Driver (*.mdb, *.accdb)},复制管理器中的全称替换到连接字符串里。
3. 绕过SQLAlchemy,直接测试pyodbc连接
先排除SQLAlchemy的配置干扰,用纯pyodbc代码测试基础连接:
import pyodbc # 替换为你确认的驱动名称和数据库路径 conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\test\TEST.accdb;ExtendedAnsiSQL=1' try: conn = pyodbc.connect(conn_str) cursor = conn.cursor() cursor.execute("SELECT 1") print("连接成功:", cursor.fetchone()) conn.close() except Exception as e: print("连接失败:", str(e))
如果这段代码失败,说明问题出在pyodbc与驱动的适配,而非Pandas或SQLAlchemy。
4. 调整SQLAlchemy引擎的创建方式
尝试改用更直接的连接字符串格式创建引擎:
import pandas as pd from sqlalchemy import create_engine accdb_path = r"C:\Users\Public\test\TEST.accdb" connection_string = ( "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};" f"DBQ={accdb_path};" "ExtendedAnsiSQL=1;" ) # 改用这种方式创建引擎 engine = create_engine(f"access+pyodbc:///?odbc_connect={connection_string}") df = pd.DataFrame([(1, "foo"), (2, "bar")], columns=["id", "txt"]) df.to_sql("my_table", engine, index=False, if_exists="append")
或者跳过access+pyodbc前缀,直接用pyodbc的URL格式:
from sqlalchemy.engine import URL connection_url = URL.create( "pyodbc", query={"odbc_connect": connection_string} ) engine = create_engine(connection_url)
5. 验证文件权限与路径
- 确保数据库文件所在文件夹对当前用户有读写权限,可尝试将数据库移到桌面等权限开放的目录测试
- 若路径包含空格或特殊字符,用双引号包裹路径(比如
DBQ="C:\Users\Public\test\TEST.accdb")
内容的提问来源于stack exchange,提问作者hyperinfer
相关产品推荐
相关产品推荐

