我正在尝试检索 Google 云端硬盘中的所有文件,但仅限于“我的云端硬盘”中的文件。我尝试在查询中包括“所有者中的‘我’”,但这给了我共享文件夹中我是所有者的大量文件。我在查询中尝试了“'root' in parents”,但这只会返回直接位于“我的驱动器”下的文件,而我还需要子文件夹下的文件和这些子文件夹的子文件夹等。
我也尝试设置驱动器参数,但在这种情况下,查询根本没有检索到任何内容:
driveid = service.files().get(fileId='root').execute()['id']
page_token = None
my_files = list()
while True:
results = service.files().list(q= "'myemail@gmail.com' in owners",
pageSize=10,
orderBy='modifiedTime',
pageToken=page_token,
spaces = 'drive',
corpora='drive',
driveId = driveid,
includeItemsFromAllDrives=True,
supportsAllDrives=True,
fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])
my_files.extend(items)
page_token = results.get('nextPageToken', None)
if page_token is None:
break
print(len(my_files))
# This prints: 0
我怎样才能让它工作?
我想另一种可能性是从根开始,获取子节点并递归地导航整个树,但这会非常慢。如果我获取所有文件,然后找出所有家长以检查他们是否在我的云端硬盘中,这同样适用,我的文件太多,这需要几个小时。
提前致谢!
最佳答案
您提出的第一个请求将是根目录中的 parent 。这是您的云端硬盘帐户的顶层。
results = service.files().list(q= "root in parents").execute()
现在您需要在代码中循环遍历此处的结果。检查 MIME 类型是否为目录 'application/vnd.google-apps.folder'
所有不是目录的内容都应该是位于 Google 云端硬盘帐户根目录中的文件。
现在你找到的所有那些目录你可以做的是发出一个新的请求来找出这些目录中的文件
results = service.files().list(q= "directorIDFromLastRequest in parents").execute()
然后您可以循环获取每个目录中的所有文件。看起来这是一个已知错误 Drive.Files.list query throws error when using "sharedWithMe = false"
与我分享
您还可以在 q 参数中设置 SharedWithMe = false
,这应该会删除与您共享的所有文件。使其仅返回实际属于您的文件。
这曾经有效,但我目前在测试时遇到问题。
速度。
如前所述,files.list 默认只返回所有内容,但没有顺序,因此从技术上讲,您可以只执行 file.list 并添加 sharedwithme 并取回驱动器帐户上的所有文件和目录。通过请求 1000 的页面大小,您将有更少的请求。然后在您的机器上对它进行本地排序。
另一种选择是按照我上面写的那样依次获取每个目录。这可能会导致更多请求。
关于python - Google Drive API 仅在我的云端硬盘中搜索文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64497533/