使用Python上传文件至SharePoint文档库遇TypeError问题求协助
错误原因分析
你遇到的TypeError: stat: path should be string, bytes, os.PathLike or integer, not BufferedReader,核心问题是**create_upload_session方法的第一个参数需要传入文件路径字符串,而非打开的文件对象**。
查看file_collection.py的源码可知,create_upload_session会调用os.path.getsize(source_path)获取文件大小,而这个方法仅接受路径类参数,无法处理文件流对象。你之前的代码错误传入了open返回的BufferedReader对象,因此触发报错。
修正后的代码
import os from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential CLIENT_ID = "my-client-id" CLIENT_SECRET = "my-secret" # 创建ClientCredential对象 client_credential = ClientCredential(CLIENT_ID, CLIENT_SECRET) # 创建SharePoint站点的ClientContext对象 ctx = ClientContext("https://MySharePointURL.sharepoint.com").with_credentials(client_credential) target_url = "/sites/mor_data_work/mor_data_work_doc_lib" target_folder = ctx.web.get_folder_by_server_relative_url(target_url) size_chunk = 1000000 file_name = "some_file_name.csv" # 确保此变量已正确定义 local_path = os.path.abspath(file_name) def print_upload_progress(offset): file_size = os.path.getsize(local_path) print("Uploaded '{0}' bytes from '{1}'...[{2}%]".format(offset, file_size, round(offset / file_size * 100, 2))) # 直接传入文件路径,无需手动打开文件 uploaded_file = target_folder.files.create_upload_session(local_path, size_chunk, print_upload_progress).execute_query() print('File {0} has been uploaded successfully'.format(uploaded_file.serverRelativeUrl))
其他潜在问题检查点
- 文件路径有效性:确认
file_name指向的文件真实存在,os.path.abspath(file_name)能正确解析到本地文件的绝对路径,避免出现文件找不到的错误。 - SharePoint目标路径正确性:验证
target_url是正确的服务器相对路径(格式通常为/sites/站点名/文档库名),确保get_folder_by_server_relative_url能定位到目标文档库文件夹。 - 权限验证:检查Client ID和Client Secret是否拥有目标文档库的写入权限,权限不足会导致后续出现403/401类权限错误。
- 分片大小设置:1MB的分片大小是合理值,若上传超大文件(如10GB以上),可适当调大分片大小提升效率,但不要超过SharePoint允许的单分片上限(通常为60MB)。
内容的提问来源于stack exchange,提问作者drewc
相关产品推荐
相关产品推荐

