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

如何用Python将Access数据库图片保存到本地?报错求助

解决方案

情况1:字段为Access Attachment附件类型

如果你的picture字段是Access专门的Attachment字段,修正代码如下:

import win32com.client
import os

daoEngine = win32com.client.Dispatch('DAO.DBEngine.120')
db_path = r"D:\Shared_Folders\Projects_for_programming\Python\ZekBase\db.accdb"
save_dir = r"D:\Shared_Folders\Projects_for_programming\Python\ZekBase"
daoDB = daoEngine.OpenDatabase(db_path)

# 确保记录集有数据再操作
query = "SELECT picture FROM picture WHERE check IN ('00036')"
daoRS = daoDB.OpenRecordset(query, 2)
if not daoRS.EOF:
    # Attachment字段的Value是一个记录集,包含所有附件
    attachment_rs = daoRS.Fields["picture"].Value
    # 移动到第一条附件记录
    attachment_rs.MoveFirst()
    # SaveToFile需要指定完整文件名,不是文件夹
    save_path = os.path.join(save_dir, "exported_picture.jpg") # 根据实际图片格式修改后缀
    attachment_rs.Fields["FileData"].SaveToFile(save_path)

daoRS.Close()
daoDB.Close()

注意:Attachment字段的原始数据存在FileData字段而非picture,且调用SaveToFile时必须传入完整文件名,不能仅传文件夹路径。

情况2:字段为OLE对象类型

如果你的picture字段是OLE对象(存储的是带包装头部的图片数据),需要剥离OLE头部后提取原始图片二进制数据:

import win32com.client
import os

def extract_ole_image(ole_data):
    # 匹配常见图片格式的起始标记
    jpg_marker = b'\xff\xd8'
    start_idx = ole_data.find(jpg_marker)
    if start_idx != -1:
        return ole_data[start_idx:]
    png_marker = b'\x89PNG'
    start_idx = ole_data.find(png_marker)
    if start_idx != -1:
        return ole_data[start_idx:]
    return None

daoEngine = win32com.client.Dispatch('DAO.DBEngine.120')
db_path = r"D:\Shared_Folders\Projects_for_programming\Python\ZekBase\db.accdb"
save_dir = r"D:\Shared_Folders\Projects_for_programming\Python\ZekBase"
daoDB = daoEngine.OpenDatabase(db_path)

query = "SELECT picture FROM picture WHERE check IN ('00036')"
daoRS = daoDB.OpenRecordset(query, 2)
if not daoRS.EOF:
    # 将memoryview类型的OLE数据转为bytes
    ole_bytes = bytes(daoRS.Fields["picture"].Value)
    image_data = extract_ole_image(ole_bytes)
    if image_data:
        # 根据实际图片格式修改后缀
        save_path = os.path.join(save_dir, "exported_picture.jpg")
        with open(save_path, "wb") as f:
            f.write(image_data)

daoRS.Close()
daoDB.Close()

说明:OLE对象会给原始图片添加额外的头部封装信息,需要通过图片格式的特征标记定位原始数据起始位置,截取后才能保存为正常可识别的图片文件。

内容的提问来源于stack exchange,提问作者Choose Goose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:48:23