使用Python访问SharePoint List失败的问题求助
问题核心
使用pywin32的win32com.client连接SharePoint List时,家用电脑及多列表查询场景出现pywintypes.com_error,提示找不到列表对象,但办公电脑可正常运行。
针对性解决方案
1. 家用电脑的认证与权限校验
- 确保家用电脑已通过浏览器登录对应SharePoint租户账号,保持会话活跃(办公电脑因域环境自动完成认证,家用电脑需手动触发)。
- 确认当前账号拥有目标列表的读取权限,可通过浏览器直接访问列表验证。
2. 统一ACE驱动版本与位数
- 家用电脑需安装与办公电脑一致的Microsoft Access Database Engine版本,且驱动位数(32/64位)必须与Python版本匹配(如Python为64位则安装64位驱动)。
- 驱动安装完成后重启电脑,确保COM组件注册生效。
3. 修正连接字符串与列表标识
- 替换
list_name中的{LIST_ID}为列表的显示名称,ID在跨环境下可能存在差异,显示名称更稳定。 - 检查
site_url的准确性,确保末尾斜杠保留,指向正确的站点根路径。
4. 多列表查询优化:复用连接对象
频繁创建新连接易引发COM资源问题,复用单个连接处理多个列表:
import win32com.client site_url = "https://tenant.sharepoint.com/sites/path/" target_lists = ["列表A", "列表B"] # 初始化单个连接 conn = win32com.client.Dispatch('ADODB.Connection') conn_str = ( "Provider=Microsoft.ACE.OLEDB.12.0;" "WSS;IMEX=1;RetrieveIds=Yes;" f"DATABASE={site_url};" ) conn.Open(conn_str) # 批量处理列表 for list_name in target_lists: rs = win32com.client.Dispatch('ADODB.Recordset') rs.Open(f"SELECT * FROM [{list_name}];", conn) # 提取数据与字段 records = rs.GetRows() fields = [field.Name for field in rs.Fields] # 此处添加数据处理逻辑 print(f"完成列表 {list_name} 提取,共 {len(records[0])} 条记录") rs.Close() conn.Close()
5. 替代方案:使用SharePoint REST API
若ACE驱动问题无法彻底解决,改用REST API更适配跨环境场景,无需依赖COM组件:
from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.user_credential import UserCredential # 配置认证信息 username = "你的租户账号@tenant.com" password = "你的账号密码" site_url = "https://tenant.sharepoint.com/sites/path/" # 初始化上下文并认证 ctx = ClientContext(site_url).with_credentials(UserCredential(username, password)) # 提取单个列表数据 list_obj = ctx.web.lists.get_by_title("列表名称") items = list_obj.items.get().execute_query() # 遍历输出数据 for item in items: print(item.properties)
内容的提问来源于stack exchange,提问作者Hermaeus
相关产品推荐
相关产品推荐

