Google云端硬盘API v3:service.files()。list不会返回所有文件夹

时间:2019-02-26 17:26:37

标签: python google-drive-api google-drive-team-drive

我正在基于Google Team Drive文件的内容实现基于树的查看器;为此,我遵循此处提供的建议:How do I search sub-folders and sub-sub-folders in Google Drive?,即进行2次API调用-一个调用以获取所有文件夹,另一个调用以获取作为这些文件夹的直接子级的所有文件。

但是,我注意到获取所有文件夹的调用并未返回所有文件夹:


res = service.files().list(
corpora='teamDrive',
pageSize=1000,
supportsTeamDrives=True,
includeTeamDriveItems=True,
teamDriveId=TEAM_DRIVE_ID,
fields='files(id,parents,name,mimeType)',
q="mimeType='application/vnd.google-apps.folder' and trashed=false"
).execute()

len(res['files'])
# 460

在这里,文件不应超过pageSize,但我肯定会从此结果中丢失大量文件夹,例如ID为specified_id的特定对象:


len([x for x in res['files'] if x['id'] == specified_id])
# 0

我认为这不是权限问题,因为我可以正常获取此文件:


specific_file = service.files().get(
    fileId=specified_id,
    supportsTeamDrives=True,
).execute()

specific_file

{'id': '...',
 'kind': 'drive#file',
 'mimeType': 'application/vnd.google-apps.folder',
 'name': '...',
 'teamDriveId': '...'}

任何其他尝试实现其他目的的技巧,也可以达到在一个API请求中获取Google(团队)驱动器中所有文件夹的目的。

1 个答案:

答案 0 :(得分:1)

您的代码中有一个错误。您的代码假定如果您拥有(例如)500个文件夹,则通过给pageSize=1000来将所有500个文件夹都包含在一个list.execute中。 这不是云端硬盘的工作方式。

pageSize仅为最大值,因此将最多包含1000个文件夹。该API不保证将包括所有不超过1000个文件夹。您需要迭代请求中的list.execute包括pageToken,直到nextPageToken==null