如何用Python将目录下Excel文件导入MS Access?解决导入报错问题
解决Python导入Excel到MS Access时的HYC00错误
这个HYC00错误是因为Microsoft Access ODBC驱动不支持SQLAlchemy默认参数绑定的部分特性,再加上你的代码存在基础语法错误,以下是具体修复方案:
1. 先修复基础语法错误
你的xls_path字符串缺少闭合单引号,这会直接导致Excel读取失败:
xls_path = r'C:\Users\JMJ\Desktop\Excel_docs' # 补上末尾的单引号
2. 修正数据类型兼容问题
Access对pandas的部分数据类型支持不佳(比如带时区的datetime、复杂object类型),需要提前转换为Access兼容的类型:
import pandas as pd import sqlalchemy as sa import openpyxl # 修复路径并读取Excel xls_path = r'C:\Users\JMJ\Desktop\Excel_docs' df = pd.read_excel(xls_path, engine=openpyxl) # 转换数据类型:处理带时区的datetime、将object转为字符串 for col in df.columns: if df[col].dtype == 'datetime64[ns, UTC]': df[col] = df[col].dt.tz_localize(None) elif df[col].dtype == 'object': df[col] = df[col].astype(str).fillna('') # 构建数据库连接 connection_string = (r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\Users\JMJ\Desktop\testdb_python.accdb;' r'ExtendedAnsiSQL=1;' ) connection_url = sa.engine.URL.create( "access+pyodbc", query={"odbc_connect": connection_string} ) engine = sa.create_engine(connection_url) # 添加if_exists参数避免表已存在的错误,指定index=False不导入索引列 df.to_sql('New_table', engine, if_exists='replace', index=False)
3. 备选方案:直接用pyodbc执行插入(绕过SQLAlchemy参数绑定问题)
如果上述方法仍报错,可以直接使用pyodbc手动处理数据插入,规避SQLAlchemy的参数绑定限制:
import pandas as pd import pyodbc import openpyxl xls_path = r'C:\Users\JMJ\Desktop\Excel_docs' df = pd.read_excel(xls_path, engine=openpyxl) # 转换数据类型(同上) for col in df.columns: if df[col].dtype == 'datetime64[ns, UTC]': df[col] = df[col].dt.tz_localize(None) elif df[col].dtype == 'object': df[col] = df[col].astype(str).fillna('') # 连接Access数据库 conn = pyodbc.connect( r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\Users\JMJ\Desktop\testdb_python.accdb;' r'ExtendedAnsiSQL=1;' ) cursor = conn.cursor() # 创建表(如果不存在,可根据实际数据类型调整字段类型) columns = ', '.join([f'[{col}] TEXT' for col in df.columns]) cursor.execute(f"CREATE TABLE IF NOT EXISTS New_table ({columns})") # 批量插入数据 placeholders = ', '.join(['?' for _ in df.columns]) insert_query = f"INSERT INTO New_table ({', '.join([f'[{col}]' for col in df.columns])}) VALUES ({placeholders})" cursor.executemany(insert_query, df.values.tolist()) conn.commit() cursor.close() conn.close()
关键注意事项
- 确保Access ODBC驱动版本(32位/64位)与你的Python版本一致,否则会出现连接失败问题。
- 如果Excel是xls格式,需改用
xlrd引擎(注意xlrd 2.0+版本不再支持xlsx格式)。
内容的提问来源于stack exchange,提问作者John Mark Johnson
相关产品推荐
相关产品推荐

