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

如何用Python从Access数据库自动下载OLE对象附件

解决Access OLE附件字段的Python提取问题

你的问题出在直接读取Attachment字段的Value,这是OLE封装后的对象,不是实际文件的原始字节。要提取里面的文件,得用Access的Recordset2对象操作附件的子记录集,步骤如下:

  • 用Access自身的Recordset2打开数据表,而非ADODB的普通Recordset
  • 从主记录集获取Attachment字段对应的子记录集,里面存储着每个附件的文件名和原始数据
  • 读取子记录集的FileData字段,这才是可以直接写入文件的字节内容

修正后的代码:

import win32com.client

# 启动Access并打开数据库
access_app = win32com.client.Dispatch("Access.Application")
access_app.OpenCurrentDatabase(r"path to Access DB")
db = access_app.CurrentDb()

# 打开主记录集(用Access的Recordset2)
main_rs = db.OpenRecordset("SELECT * FROM tablename")
main_rs.MoveFirst()  # 移动到你要提取的记录行,可根据条件定位

# 获取附件字段的子记录集
attachments_rs = main_rs.Fields("Attachment").Value

# 循环处理每个附件(一个字段可能存多个)
attachments_rs.MoveFirst()
while not attachments_rs.EOF:
    # 获取文件名和原始数据
    file_name = attachments_rs.Fields("FileName").Value
    file_data = attachments_rs.Fields("FileData").Value
    
    # 写入文件
    with open(file_name, "wb") as f:
        f.write(file_data)
    
    attachments_rs.MoveNext()

# 关闭资源
attachments_rs.Close()
main_rs.Close()
access_app.Quit()

关键说明:

  • Access的Attachment字段(或存储附件的OLE字段)本质是嵌套的子记录集,每个子记录包含FileName(原始文件名)、FileData(文件字节)等字段
  • 必须用Access原生的Recordset2(通过CurrentDb().OpenRecordset获取)才能正确解析这个子记录集,ADODB普通Recordset无法处理这种嵌套结构
  • 如果只需要提取特定记录的附件,可以在SELECT语句中加WHERE条件定位,比如SELECT * FROM tablename WHERE ID = 123

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:22:41