如何使用Python无需知晓文件名和下载URL读取OneDrive文件夹内所有文件
解决方案
直接下载整个文件夹的方法
完全可以不用获取单个文件的下载URL,也不需要提前知晓所有文件名,两种可行方案:
- 桌面端同步:将目标文件夹添加到OneDrive本地同步列表,开启同步后所有文件会自动下载到本地对应目录,全程不需要操作任何下载链接。
- 网页端批量下载:登录OneDrive网页版,右键点击目标文件夹选择「下载」,平台会自动将整个文件夹打包为ZIP文件输出,不需要单独处理单个文件。
Python无感知读取/下载的实现
不需要提前知道文件名和下载URL,通过调用Microsoft Graph API即可实现全自动操作,步骤如下:
前置准备
- 在Azure应用注册门户创建应用,获取
tenant_id、client_id、client_secret,为应用分配Files.Read.All等对应OneDrive访问权限。 - 安装依赖库:
pip install msgraph-core azure-identity
示例代码
from azure.identity import ClientSecretCredential from msgraph.core import GraphClient # 替换为自身应用凭证 credential = ClientSecretCredential( tenant_id="YOUR_TENANT_ID", client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET" ) graph_client = GraphClient(credential=credential) # 替换为目标驱动器ID和文件夹路径 drive_id = "YOUR_DRIVE_ID" folder_relative_path = "target/folder/path" # 自动拉取文件夹下所有子项 folder_endpoint = f"/drives/{drive_id}/root:/{folder_relative_path}:/children" folder_items = graph_client.get(folder_endpoint).json() for item in folder_items.get("value", []): # 仅处理文件,跳过子文件夹(如需嵌套遍历可添加递归逻辑) if "file" not in item: continue # 自动获取文件ID拉取内容,无需手动拼接下载URL file_content = graph_client.get(f"/drives/{drive_id}/items/{item['id']}/content").content # 可自定义处理逻辑:如直接解析内容,或保存到本地 with open(item["name"], "wb") as f: f.write(file_content)
注意事项
- 个人版OneDrive可将认证方式替换为设备码认证或用户名密码认证,文件拉取逻辑完全一致。
- 如需遍历多层嵌套文件夹,添加递归逻辑判断子项类型即可,无需额外手动获取任何信息。
- 所有文件名、文件访问路径都由接口自动返回,全程不需要提前知晓任何文件相关信息。
内容的提问来源于stack exchange,提问作者Sonia Portillo Clota
相关产品推荐
相关产品推荐

