Python os.walk()遍历OneDrive目录时因文件数量异常忽略文件
问题概述
- 遍历OneDrive同步的SharePoint快捷方式目录时,当某目录文件数量达到897个,
os.walk()会完全忽略该目录下的所有文件;删除任意2个文件后,遍历恢复正常 - 改用
glob.glob()方案仅能获取该目录下约一半的文件,同样删除2个文件后可获取完整列表 - 将文件复制到本地非OneDrive同步目录后,遍历完全正常,确认问题与OneDrive同步机制相关
- 已排查微软官方《OneDrive和SharePoint的限制》文档,当前文件数量/大小远未达到官方标注的限制;尝试重新同步目录、重启OneDrive/电脑、完全重置OneDrive均无法解决问题
- 进一步验证发现:当文件数量触发阈值时,
os.listdir()、win32file.FindFilesW()等底层文件操作函数会抛出OSError: [WinError 87] 参数不正确错误,且同一组织内另一台机器可复现该问题
可行解决方向
1. 拆分目录文件数量
既然实际测试发现阈值在895个文件左右(897-2),可手动将该目录拆分为多个子目录,每个子目录的文件数控制在890以内,直接绕过OneDrive同步目录的隐性遍历限制。
2. 使用OneDrive/SharePoint官方API替代本地遍历
放弃依赖本地同步后的文件系统,直接调用官方API读取目录内容:
# 示例:使用Microsoft Graph API获取SharePoint目录文件(需提前获取访问令牌) import requests access_token = "你的有效访问令牌" site_id = "目标SharePoint站点ID" drive_id = "目标文档库ID" folder_path = "/你的问题目录路径" api_url = f"https://graph.microsoft.com/v1.0/sites/{site_id}/drives/{drive_id}/root:{folder_path}:/children" headers = {"Authorization": f"Bearer {access_token}"} response = requests.get(api_url, headers=headers) if response.status_code == 200: file_list = [item["name"] for item in response.json()["value"]] print(f"获取到文件:{file_list}")
3. 调整OneDrive同步设置排查
- 关闭OneDrive的“按需文件”功能,等待目录完全同步到本地后,再次测试遍历逻辑(尽管用户已手动下载全部文件,但同步缓存可能存在异常)
- 查看OneDrive同步日志(设置>关于>查看日志),排查是否有针对该目录的同步错误记录
4. 尝试第三方/替代遍历方法
使用pathlib库的迭代方法尝试遍历,看是否能规避底层API的限制:
from pathlib import Path target_root = Path("你的主目录路径") files = [] for item in target_root.rglob("*"): if item.is_file() and "Common part" in str(item.parent): files.append(str(item)) print(files)
总结
该问题属于OneDrive同步SharePoint目录时的隐性未公开限制,导致系统底层文件操作API调用失败。优先推荐拆分目录的快速解决方式,长期方案建议使用官方API进行文件操作,避免依赖本地同步的文件系统。
内容的提问来源于stack exchange,提问作者wind5piel
相关产品推荐
相关产品推荐

