Python获取个人OneDrive/SharePoint文件列表返回空列表问题
问题描述
尝试通过Python获取公司内部个人OneDrive/SharePoint指定文件夹的所有文件列表,执行代码无报错但返回空列表。能直接访问单个文件内容,但无法获取文件列表。
原代码如下:
from office365.runtime.auth.authentication_context import AuthenticationContext from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.user_credential import UserCredential from office365.sharepoint.files.file import File import io user = 'user' pw = 'pw' url = 'https://company-my.sharepoint.com' rel_url = '/personal/name_company/Documents/further/path/to/folder/' ctx_auth = AuthenticationContext(url) if ctx_auth.acquire_token_for_user(user, pw): ctx = ClientContext(url, ctx_auth) web = ctx.web ctx.load(web) ctx.execute_query() print('Authenticated into sharepoint as: ',web.properties['Title']) else: print(ctx_auth.get_last_error()) folder = ctx.web.get_folder_by_server_relative_url(rel_url) fold_names = [] sub_folders = folder.files #Replace files with folders for getting list of folders ctx.load(sub_folders) ctx.execute_query() for s_folder in sub_folders: fold_names.append(s_folder.properties["Name"]) print(fold_names)
输出为空列表:[]
另外尝试访问站点默认文档库根文件夹也返回空:
root_folder = ctx.web.default_document_library().root_folder ctx.load(root_folder,['Files']) ctx.execute_query() for f in root_folder.files: print(f.name)
输出同样为空:[]
但可以正常访问单个文件:
url = 'https://company-my.sharepoint.com/personal/name_company/Documents/further/path/to/folder/file.xlsx' ctx_auth = AuthenticationContext(url) if ctx_auth.acquire_token_for_user(user, pw): ctx = ClientContext(url, ctx_auth) web = ctx.web ctx.load(web) ctx.execute_query() print("Authentication successful") else: print(ctx_auth.get_last_error()) resp = File.open_binary(ctx,url) bytes_file_obj = io.BytesIO() bytes_file_obj.write(resp.content) bytes_file_obj.seek(0) #set file object to start df = pd.read_excel(bytes_file_obj,engine='openpyxl',header=0) print(df)
问题原因分析
核心问题是个人OneDrive(My Site)的站点上下文初始化错误:
- 初始化
ClientContext时使用的是根站点URLhttps://company-my.sharepoint.com,但个人OneDrive对应的是子站点https://company-my.sharepoint.com/personal/name_company,上下文指向错误导致无法正确定位文件夹。 - 服务器相对路径参数错误:
get_folder_by_server_relative_url需要的是相对于当前上下文站点的路径,而非根站点的完整路径。
解决方法
修正站点URL和相对路径,重新初始化上下文后即可正确获取文件列表:
修正后的代码
from office365.runtime.auth.authentication_context import AuthenticationContext from office365.sharepoint.client_context import ClientContext import io user = 'user' pw = 'pw' # 替换为个人OneDrive的站点URL site_url = 'https://company-my.sharepoint.com/personal/name_company' # 替换为相对于个人站点的文件夹路径(去掉/personal/name_company前缀) folder_rel_url = '/Documents/further/path/to/folder/' ctx_auth = AuthenticationContext(site_url) if ctx_auth.acquire_token_for_user(user, pw): ctx = ClientContext(site_url, ctx_auth) web = ctx.web ctx.load(web) ctx.execute_query() print('Authenticated into sharepoint as: ', web.properties['Title']) else: print(ctx_auth.get_last_error()) # 获取目标文件夹 folder = ctx.web.get_folder_by_server_relative_url(folder_rel_url) files = folder.files ctx.load(files) ctx.execute_query() # 提取文件名列表 file_names = [file.name for file in files] print(file_names)
关键修改点
- 将
site_url改为个人OneDrive的完整站点URL(包含/personal/xxx的部分)。 - 将
folder_rel_url改为相对于该个人站点的路径,去掉前面的/personal/name_company前缀。 - 直接使用
file.name属性获取文件名(office365库的文件对象已封装该属性,无需读取properties["Name"])。
针对默认文档库的修正
如果需要访问个人OneDrive的默认文档库根文件夹,修正代码如下:
root_folder = ctx.web.default_document_library().root_folder ctx.load(root_folder.files) ctx.execute_query() for f in root_folder.files: print(f.name)
确保ClientContext指向个人站点URL即可正常返回文件列表。
内容的提问来源于stack exchange,提问作者Alexander Scherrmann
相关产品推荐
相关产品推荐

