You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:45:35