我正在尝试检索Google云端硬盘中的所有文件,但仅检索“我的云端硬盘”中的文件。我尝试在查询中包括“所有者中的我”,但这使我在拥有者的共享文件夹中拥有大量文件。我在查询中尝试了“父母的'root'”,但这只返回了直接在“我的云端硬盘”下的文件,而我还需要这些子文件夹的子文件夹和子文件夹下的文件,等等。
我也尝试设置drive参数,但是在这种情况下,查询根本不检索任何内容:
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
如何使它正常工作?
我猜另一种可能性是从根开始,找孩子,然后递归地导航整棵树,但这将非常缓慢。如果我获取了所有文件,然后找出所有父母来检查它们是否在“我的云端硬盘”中,则我的文件过多,需要花费几个小时。
谢谢!
答案 0 :(得分:1)
您提出的第一个请求将是对父母的根本要求。这是您的驱动器帐户的最高级别。
results = service.files().list(q= "root in parents").execute()
现在,您将需要循环遍历代码中的结果。检查是否为目录'application/vnd.google-apps.folder'
的mime类型不是目录的所有内容都应该是位于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,您的请求将减少。然后将其全部关闭在本地计算机上进行排序。
另一个选择是按照我上面的描述进行操作,然后依次获取每个目录。这可能会导致更多请求。
答案 1 :(得分:0)
在此处可能会使用Google驱动器API v3和python 3.7+的修复
使用以下语法:
q="mimeType='application/vnd.google-apps.folder' and trashed = false and 'me' in owners"
此查询传递给service.files()。list方法应该可以为您提供所需的信息。您拥有的所有文件夹的列表,这是我能找到的最佳解决方法。 “ 所有者中的“我” ”是这里的关键。
完整的代码段在这里:
response = service.files().list(q="mimeType='application/vnd.google-apps.folder' and trashed = false and 'me' in owners",
spaces='drive',
fields='nextPageToken, files(id, name)',
pageToken=page_token).execute()
for file in response.get('files', []):
# Process change
print ('Found file: %s (%s)' % (file.get('name'), file.get('id')))