将SharePoint Zip文件下载PowerShell命令转换为Python代码时遭遇400错误的问题排查
问题分析与解决方案
你的问题核心出在URL中$value的转义处理错误——PowerShell和Python的转义规则完全不同,导致你发送给SharePoint的请求路径格式异常,最终返回400 Bad Request错误。
具体问题点拆解
在PowerShell里,$是变量标识符,所以必须用反引号(`)转义,才能让它作为普通字符传递给服务器:
$FileUrl = "https://xxx.sharepoint.com/sites/xxx/_api/Web/GetFileByServerRelativePath(decodedurl='sites/xxx/path/to/file.zip')/`$value"
但在Python中,反引号()不是转义字符,你写的URL里的`$value会被Python原样解析成包含反引号的字符串,也就是实际发送的URL末尾是`$value,而非SharePoint接口要求的$value`。服务器无法识别这个错误路径,自然返回400错误。
修正后的Python代码
只需要去掉$前面的反引号,直接保留$value即可:
import requests # 移除$前的反引号,使用正确的URL路径 FileUrl = "https://xxx.sharepoint.com/sites/xxx/_api/Web/GetFileByServerRelativePath(decodedurl='sites/xxx/path/to/file.zip')/$value" headers = { "Authorization": "Bearer eyJ..." } # 建议添加stream=True处理大文件,避免内存过载 r = requests.get(FileUrl, headers=headers, stream=True) # 先验证请求是否成功,避免生成空文件 r.raise_for_status() # 分块写入文件,更高效稳定 with open(r"C:\path\to\file.zip", "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print("文件下载完成!")
额外优化建议
- 加上
stream=True和分块写入:对于较大的Zip文件,这种方式不会一次性把整个文件加载到内存,避免内存占用过高。 - 使用
r.raise_for_status():在请求失败时直接抛出异常,能快速定位问题,而不是默默生成空文件。 - 确认令牌有效性:虽然PowerShell能成功,但要保证Python运行时你的Bearer令牌仍在有效期内。
内容的提问来源于stack exchange,提问作者Matthew Thomas
相关产品推荐
相关产品推荐

