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。递归

无论什么原因,我们都会把福尔德拉的孩子列在名单上 作为文件夹的子对象,递归列出其子对象, 重复一遍。在极少数情况下,这可能是最好的 方法,但对大多数人来说,它存在以下问题:-

  • 为每个子文件夹执行服务器往返是非常耗时的。这当然取决于树的大小,所以如果 你可以保证你的树是小的,它可以是好的
备选方案2。共同的父母

如果所有文件都是由你的应用程序创建的(即。 您正在使用drive.file(范围)。以及文件夹层次结构 在上面,创建一个名为“MyAppCommonParent”的虚拟父文件夹。作为 将每个文件创建为其特定文件夹的子文件,还可以 使其成为MyAppCommonParent的子级。这就变得更加重要了 如果您记得将文件夹视为标签,则会很直观。你现在可以 只需查询
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