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

