如何用Office365-REST-Python-Client下载SharePoint站点完整文件系统
需求说明
我拥有一个名为“ABC”的SharePoint站点,其文件结构如下:
|-Folder1 | |--file_1_1.docx | |--file_1_2.docx | |-Folder2 | |--file_2_1.docx | |-file_x.docx
需要将所有文件(包括根目录和子文件夹内的)下载到本地,使用Office365-REST-Python-Client库实现,之前的代码仅能获取文件夹信息,无法获取和下载文件。
解决方案代码
import os import traceback from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential client_id = "XXXXX" client_secret = "YYYY" site_url = "https://tenantName.sharepoint.com/sites/ABC" relative_url = "Documents" # 本地保存根路径,可自行修改 local_root_path = "./sharepoint_downloads" def download_file(file, local_path): """下载单个文件到指定本地路径""" try: # 创建本地目录(如果不存在) os.makedirs(os.path.dirname(local_path), exist_ok=True) # 下载文件 with open(local_path, "wb") as local_file: file.download(local_file).execute_query() print(f"已下载: {local_path}") except Exception: traceback.print_exc() print(f"下载失败: {file.properties['Name']}") def traverse_folder(ctx, folder, local_parent_path): """递归遍历文件夹,下载所有文件""" # 加载当前文件夹的文件和子文件夹 folder.expand(["Files", "Folders"]).get().execute_query() # 处理当前文件夹下的文件 for file in folder.files: local_file_path = os.path.join(local_parent_path, file.properties["Name"]) download_file(file, local_file_path) # 递归处理子文件夹 for sub_folder in folder.folders: sub_folder_local_path = os.path.join(local_parent_path, sub_folder.properties["Name"]) traverse_folder(ctx, sub_folder, sub_folder_local_path) def connectAuth(): client_credentials = ClientCredential(client_id, client_secret) ctx = ClientContext(site_url).with_credentials(client_credentials) try: # 获取文档库根文件夹 libraryRoot = ctx.web.get_folder_by_server_relative_path(relative_url) # 开始遍历下载 traverse_folder(ctx, libraryRoot, local_root_path) print("所有文件下载完成") except Exception: traceback.print_exc() print('遍历或下载过程中出现问题') if __name__ == "__main__": connectAuth()
关键说明
- 递归遍历逻辑:通过
traverse_folder函数递归处理每个文件夹,先下载当前目录的文件,再进入子文件夹重复操作 - 文件下载:
download_file函数负责创建本地目录(避免路径不存在报错),并将SharePoint文件写入本地 - 本地路径映射:保持SharePoint的文件夹结构,在本地
local_root_path下生成对应的目录和文件 - 权限验证:沿用原有的ClientCredential认证方式,确保能访问目标站点和文档库
内容的提问来源于stack exchange,提问作者draaken
相关产品推荐
相关产品推荐

