Google drive api 使用google drive rest递归搜索文件
我正在尝试获取在父目录下创建的所有文件。父目录有很多子目录,后面是这些目录中的文件Google drive api 使用google drive rest递归搜索文件,google-drive-api,Google Drive Api,我正在尝试获取在父目录下创建的所有文件。父目录有很多子目录,后面是这些目录中的文件 parent --- sub folder1 --- file1 --- file2 目前,我正在获取子文件夹的所有ID,并构造一个查询,如父文件夹中的q:“subfolder1id”或父文件夹中的“subfolder2id”,以查找文件列表。然后我分批发行。如果我有100个文件夹,我会发出10个搜索查询,批量大小为10 有没有更好的方法使用google drive rest api查询文件,一
parent
--- sub folder1
--- file1
--- file2
目前,我正在获取子文件夹的所有ID,并构造一个查询,如父文件夹中的q:“subfolder1id”或父文件夹中的“subfolder2id”,以查找文件列表。然后我分批发行。如果我有100个文件夹,我会发出10个搜索查询,批量大小为10
有没有更好的方法使用google drive rest api查询文件,一次查询就能得到所有文件 这是你问题的答案
与您的场景中的想法相同:
我认为你可以从三个备选答案中得到一个想法
备选方案1。递归
无论什么原因,我们都会把福尔德拉的孩子列在名单上
作为文件夹的子对象,递归列出其子对象,
重复一遍。在极少数情况下,这可能是最好的
方法,但对大多数人来说,它存在以下问题:-
- 为每个子文件夹执行服务器往返是非常耗时的。这当然取决于树的大小,所以如果 你可以保证你的树是小的,它可以是好的
MyAppCommonParent,即可轻松检索所有描述
在家长中
备选方案3。文件夹优先
从获取所有文件夹开始。是的,都是。一旦你拥有了它们
在内存中,您可以在其父属性中爬行并生成
您的树结构和文件夹ID列表。然后你可以做一个单曲
files.list?q='folderA'在父级中或'folderA1'在父级或
家长中的“folderA1a”…
使用此技术可以
在两个http调用中完成所有操作
备选方案2是最有效的,但只有在您有
控制文件创建。备选方案3通常更有效
与备选方案1不同,但可能存在某些小树尺寸,其中1
这是最好的
scope=[]https://www.googleapis.com/auth/drive']
credentials=ServiceAccountCredentials.from_json_keyfile_name('您的json凭据'%path,scope'))
服务=生成('drive','v3',凭据=凭据)
folder\u tree=“要开始搜索的文件夹的名称”
文件夹_id={}
文件夹\u id[“要开始搜索的文件夹的名称”]=文件夹\u id
def检查子文件夹(文件夹id):
新的_子_模式={}
folders=service.files().list(q=“mimeType='application/vnd.google apps.folder'和父文件夹在“+”folder_id+”中,trashed=false”,fields=“nextPageToken,files(id,name)”,pageSize=400)。execute()
所有文件夹=文件夹。获取('files',[])
所有\u文件=检查\u文件(文件夹\u id)
n_files=len(所有_文件)
n_folders=len(所有_文件夹)
旧文件夹树=文件夹树
如果没有文件夹!=0:
对于i,枚举中的文件夹(所有_文件夹):
文件夹名称=文件夹['name']
子文件夹\模式=旧文件夹\树+'/'+文件夹\名称
新建\u模式=子文件夹\u模式
新的子文件夹模式[子文件夹模式]=文件夹['id']
打印('新图案:',新图案)
所有_文件=检查_文件(文件夹['id'])
n_files=len(所有_文件)
新建文件夹树=新建模式
如果n_文件!=0:
对于所有_文件中的文件:
file_name=file['name']
新建文件树模式=子文件夹模式+“/”+文件名
新的子模式[新的文件树模式]=file['id']
打印(“添加的文件:”,文件名)
其他:
打印('未找到文件')
其他:
所有\u文件=检查\u文件(文件夹\u id)
n_files=len(所有_文件)
如果n_文件!=0:
对于所有_文件中的文件:
file_name=file['name']
子文件夹[文件夹树+'/'+文件名]=文件['id']
新建文件树模式=子文件夹模式+“/”+文件名
新的子模式[新的文件树模式]=file['id']
打印(“添加的文件:”,文件名)
返回新的\u子\u模式
def检查文件(文件夹id):
其他文件=service.files().list(q=“mimeType!”=“application/vnd.google apps.folder”和父文件夹位于“+”folder“id+”,trashed=false”,fields=“nextPageToken,files(id,name)”,pageSize=400)。执行()
所有其他文件=其他文件。获取('files',[])
返回所有其他文件
def get_文件夹树(文件夹id):
全局文件夹树
子文件夹=检查子文件夹(文件夹id)
对于i,枚举(sub_folders.values())中的sub_folder_id:
folder_tree=列表(sub_folders.keys())[i]
打印(“当前文件夹树:”,文件夹树)
文件夹ID.update(子文件夹)
打印(“*******************************************************************递归搜索开始*************************************************************************************”)
尝试:
获取文件夹树(子文件夹id)
除:
打印('---------------------------------------无进一步说明--------------------------------------------')
返回文件夹\u id
文件夹\u id=获取文件夹\u树(文件夹\u id)
我认为备选方案3是我正在做的,但备选方案2是一个很好的解决方案。非常感谢:)这真的很方便。谢谢。谷歌现在在谷歌硬盘中强制执行单亲,所以备选方案2将不再有效。定义文件夹\u tree=“您的姓名
folderA____ folderA1____folderA1a
\____folderA2____folderA2a
\___folderA2b