如何解决PyDrive无法获取Google Drive共享文件夹文件列表并实现下载?
解决PyDrive无法访问“共享给我”的Google Drive文件夹并实现文件下载
问题原因
默认的ListFile查询仅返回你拥有所有权的文件,而“共享给我”的文件夹内的文件所有权不属于你,因此需要调整查询参数和API配置来包含这些共享资源。另外你的认证代码存在冗余,会导致不必要的重复授权操作。
修正后的完整代码
from pydrive.drive import GoogleDrive from pydrive.auth import GoogleAuth # 初始化认证,移除冗余代码 gauth = GoogleAuth() gauth.LoadCredentialsFile("mycreds.txt") if gauth.credentials is None: # 首次认证,启动本地网页授权 gauth.LocalWebserverAuth() elif gauth.access_token_expired: # 刷新过期的令牌 gauth.Refresh() else: # 已有有效凭证,直接授权 gauth.Authorize() # 保存更新后的凭证 gauth.SaveCredentialsFile("mycreds.txt") drive = GoogleDrive(gauth) # 共享文件夹ID shared_folder_id = "1CNtWRS005fkX6vlZowZiXYITNGifXPKS" # 调整查询参数:包含共享给我的文件,排除已删除文件 # supportsAllDrives和includeItemsFromAllDrives是访问共享资源的关键参数 file_list = drive.ListFile({ 'q': f"'{shared_folder_id}' in parents and trashed=false and 'me' in readers", 'supportsAllDrives': True, 'includeItemsFromAllDrives': True }).GetList() # 遍历文件列表并下载 for file in file_list: print(f"找到文件: {file['title']} (ID: {file['id']})") # 下载文件到本地,文件名使用原文件标题 file.GetContentFile(file['title']) print(f"已下载: {file['title']}")
关键修改说明
- 冗余认证代码清理:删除了重复的
gauth.LoadCredentialsFile和gauth.LocalWebserverAuth调用,避免重复授权流程。 - 查询参数优化:
- 添加
'me' in readers:确保查询包含你有读取权限的文件(即共享给你的文件)。 - 添加
trashed=false:排除已放入回收站的文件,避免无效结果。 - 新增
supportsAllDrives: True和includeItemsFromAllDrives: True:这两个参数是访问共享驱动器或外部共享文件夹的必要配置,告诉API需要包含非你所有的共享资源。
- 添加
- 文件下载实现:使用
GetContentFile()方法直接将文件保存到本地,参数为本地保存的文件名(这里直接用原文件标题)。
额外注意事项
- 确保你的Google账号确实拥有该共享文件夹的读取权限,如果权限不足仍会返回空列表。
- 如果共享文件夹层级较深,需要递归遍历子文件夹的话,可以在循环中判断文件类型(
file['mimeType'] == 'application/vnd.google-apps.folder'),然后递归调用查询逻辑。
内容的提问来源于stack exchange,提问作者auem
相关产品推荐
相关产品推荐

