Office365 Rest API调用get_folder_by_server_relative_url.add()报TypeError错误求助
你的问题是因为office365-python-client库版本更新导致API不兼容:旧版本中files.add()方法支持传入FileCreationInformation对象,但新版本的方法签名已变更,需要直接传入文件名、文件内容等参数。
解决方案1:适配新版本API直接传参
删除FileCreationInformation相关代码,直接调用add()方法并传入所需参数:
# 移除原来的FileCreationInformation代码块 with open(path, 'rb') as content_file: file_content = content_file.read() # 直接调用add方法,传入文件名、内容、覆盖选项 target_folder_obj = context.web.get_folder_by_server_relative_url(target_folder) result_file = target_folder_obj.files.add(target_file, file_content, overwrite=True) context.execute_query()
解决方案2:使用更简洁的upload_file方法(推荐)
新版本库提供了更直观的upload_file方法,无需手动构建信息对象:
with open(path, 'rb') as content_file: file_content = content_file.read() target_folder_obj = context.web.get_folder_by_server_relative_url(target_folder) # 直接上传文件,自动处理覆盖逻辑 result_file = target_folder_obj.upload_file(target_file, file_content).execute_query()
修改后的完整代码示例
import logging from office365.runtime.auth.authentication_context import AuthenticationContext from office365.sharepoint.client_context import ClientContext import os ###### Logging setup #################################################### logger = logging.getLogger() logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) ######################################################################### # Site settings that won't change site_root = '/Sites/SampleSite' site_url = 'https://REDACTED.sharepoint.com' + site_root # Specify the file to upload path = "./SampleFile1.xlsx" target_folder = "Shared%20Documents/UserFiles" target_file = "SampleFile1.xlsx" # SharePoint app-only principal - credentials client_id = 'REDACTED' client_secret = 'REDACTED' context_auth = AuthenticationContext(site_url) if context_auth.acquire_token_for_app(client_id, client_secret): context = ClientContext(site_url, context_auth) with open(path, 'rb') as content_file: file_content = content_file.read() target_folder_obj = context.web.get_folder_by_server_relative_url(target_folder) # 使用upload_file方法上传 result_file = target_folder_obj.upload_file(target_file, file_content).execute_query() print('File {0} has been uploaded successfully'.format(result_file.properties['ServerRelativeUrl'])) else: # No token or error was returned logger.critical("Authentication failed") try: logger.critical(context_auth.get_last_error()) except: logger.critical("Reason for failure is unknown")
额外说明
如果需要固定库版本避免后续自动更新导致的兼容问题,可以指定支持旧写法的版本:
pip install office365-python-client==2.3.10
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

