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

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)的站点上下文初始化错误:

  1. 初始化ClientContext时使用的是根站点URL https://company-my.sharepoint.com,但个人OneDrive对应的是子站点https://company-my.sharepoint.com/personal/name_company,上下文指向错误导致无法正确定位文件夹。
  2. 服务器相对路径参数错误: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)

关键修改点

  1. 将site_url改为个人OneDrive的完整站点URL(包含/personal/xxx的部分)。
  2. 将folder_rel_url改为相对于该个人站点的路径,去掉前面的/personal/name_company前缀。
  3. 直接使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:10:07