Python使用zipfile临时解压accdb后,pyodbc无法获取文件路径的问题
解决方案
pyodbc连接Access数据库必须依赖实际磁盘文件路径,无法直接读取内存中的文件对象。因此需要将ZIP包内的.accdb文件临时提取到本地磁盘,用完后自动清理。
修改后代码:
import zipfile import pyodbc import io import tempfile import os # 保留原有变量定义(ano_archivo, mes_archivo, directorio, archivo, statement等) with zipfile.ZipFile(directorio + archivo, mode='r') as archive: zip_filename = f'cmg{ano_archivo[2:4]}{mes_archivo}.zip' zip_internal_path = f'03 Bases de Datos/01 Balance Físico/{zip_filename}' zfiledata = io.BytesIO(archive.read(zip_internal_path)) with zipfile.ZipFile(zfiledata) as archive2: accdb_filename = f'cmg{ano_archivo[2:4]}{mes_archivo}.accdb' # 创建临时目录并提取文件 with tempfile.TemporaryDirectory() as temp_dir: temp_accdb_path = os.path.join(temp_dir, accdb_filename) archive2.extract(accdb_filename, temp_dir) # 构建连接字符串并执行查询 conn_str = f"Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={temp_accdb_path};" with pyodbc.connect(conn_str) as conn: with conn.cursor() as cursor: cursor.execute(statement) resultado = cursor.fetchall() print(resultado)
核心要点:
- 使用
tempfile.TemporaryDirectory()创建自动销毁的临时目录,无需手动清理文件。 - 通过
archive2.extract()将.accdb文件提取到临时目录,获得有效磁盘路径。 - 连接字符串中使用临时路径,解决"无效文件名"的报错问题。
原代码错误原因:
原代码中连接字符串的DBQ参数仅传入了文件名archivo_cmg,而非实际存在的磁盘路径,导致Access驱动无法定位文件。
内容的提问来源于stack exchange,提问作者jpflow
相关产品推荐
相关产品推荐

