使用Pandas读取SharePoint Excel文件出现XLRDError报错如何解决?
报错原因
你拿到的返回内容开头是b'\r\n<!DOCT',对应HTML文档的DOCTYPE声明头,说明你请求拿到的根本不是Excel二进制文件,是SharePoint的网页页面(大概率是权限验证页、文件预览页),所以pandas调用xlrd解析的时候识别不到Excel文件的标准BOF头,才抛出该错误。
核心错误点是你代码中两个url参数混用:
- 初始化
AuthenticationContext用的是SharePoint站点的根地址,格式一般为https://<租户名>.sharepoint.com/sites/<站点名> - 调用
File.open_binary用的应该是Excel文件的实际直链/服务器相对路径,你两个参数填了同一个地址,自然返回的是站点页面而非文件内容。
解决方案
步骤1:获取正确的Excel文件路径
打开SharePoint中目标Excel文件,按以下操作拿直链:
- 点击顶部菜单栏「文件」-「信息」-「复制路径」
- 删掉复制到的路径末尾的
?web=1后缀,得到的就是文件的完整直链 - 如果你要用服务器相对路径,格式为
/sites/<站点名>/<文档库名>/<子文件夹>/<文件名>.xlsx
步骤2:修改代码
拆分两个url参数,修正后的代码如下:
from office365.runtime.auth.authentication_context import AuthenticationContext from office365.sharepoint.client_context import ClientContext import pandas as pd import io # 站点根地址,用于身份验证 site_url = 'https://xxx.sharepoint.com/sites/你的站点名' # Excel文件的完整直链/服务器相对路径 file_path = '/sites/你的站点名/Shared Documents/测试文件.xlsx' username = '你的账号' password = '你的密码' ctx_auth = AuthenticationContext(site_url) if ctx_auth.acquire_token_for_user(username, password): ctx = ClientContext(site_url, ctx_auth) # 验证身份通过 print("Authentication successful") # 读取文件流 response = ctx.web.get_file_by_server_relative_path(file_path).open_binary_stream().execute_query() # 转成BytesIO读入pandas bytes_file_obj = io.BytesIO(response.value) df = pd.read_excel(bytes_file_obj) print(df)
异常排查
- 先验证返回内容类型:可在拿到响应后加一行代码
with open("test.tmp", "wb") as f: f.write(response.value),打开文件如果是HTML内容,优先检查账号是否有该文件的读取权限,账号是否开启了多因素认证(MFA),Office365 SDK不支持MFA账号登录,需关闭MFA或使用应用密码。 - 不要尝试用
read_csv读取非CSV格式的内容,你之前拿到的全在一列的结果本质是HTML标签,不是有效表格数据,解决返回内容的问题后不需要再调用该方法。
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

