You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Office365-REST-Python-Client下载SharePoint站点完整文件系统

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:07:57