如何用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
相关产品推荐
相关产品推荐

