在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID

2024-04-11

我正在尝试编写一个程序来将文件夹和所有内容(包括子文件夹等)复制到另一个文件夹。

我可能过于复杂化了,但我觉得第一步是获取与它们关联的所有文件名和 ID,并将它们保存到两个列表中 - 一个用于文件,一个用于文件夹。

我无法让我的程序递归地遍历所有子文件夹,我认为 for 循环可以使用 i 从正在填充的列表中选择索引来实现这一点。

正如您从下面的输出中看到的,我的程序正在遍历传递给函数的目录和第一个子文件夹,但随后程序会干净地退出。

对大量代码表示歉意,但我想上下文很重要。

Input:

listofdictFolders = []
listofdictFiles = []


def mapFolderContents(folderid):
    # retrieves parent name from folderid
    parentfolder = service.files().get(fileId=folderid).execute()
    parentname = 'Title: %s' % parentfolder['name']
    # sets query as argument passed to function, searches for mimeType matching folders and saves to variable
    folderquery = "'" + folderid + "'" + " in parents and mimeType='application/vnd.google-apps.folder'"
    childrenFoldersDict = service.files().list(q=folderquery,
                                               spaces='drive',
                                               fields='files(id, name)').execute()
    # sets query as argument passed to function, searches for mimeType matching NOT folders and saves to variable
    notfolderquery = "'" + folderid + "'" + \
                     " in parents and not mimeType='application/vnd.google-apps.folder'"
    childrenFilesDict = service.files().list(q=notfolderquery,
                                             spaces='drive',
                                             fields='files(name, id)').execute()
    # takes value pair of 'files' which is a list of dictionaries containing ID's and names.
    childrenFolders = (childrenFoldersDict['files'])
    # takes value pair of 'files' which is a list of dictionaries containing ID's and names.
    childrenFiles = (childrenFilesDict['files'])
    # if no files found, doesn't append to list
    if len(childrenFiles) > 0:
        listofdictFiles.append(['Parent Folder ' + parentname, childrenFiles])
    # if no folders found, doesn't append to list 
    if len(childrenFolders) > 0:
        listofdictFolders.append(['Parent Folder ' + parentname, childrenFolders])
    # finds length of list for use in for loop later to avoid index out of range error
    maxIndex = len(listofdictFolders)
    # for loop to find ID's and names of folders returned above and append name and ID's to dictionary
    for i in range(0, maxIndex):
        # strip variables are to access ID values contained in dictionary
        strip1 = listofdictFolders[0]
        strip2 = strip1[1]
        print('Now indexing ' + str(strip2[i]['name']) + '...')
        # saves query to variable using strip2 variable, index and 'id' key
        loopquery = "'" + str(strip2[i]['id']) + "'" \
                    + " in parents and mimeType='application/vnd.google-apps.folder'"
        loopquery2 = "'" + str(strip2[i]['id']) + "'" \
                    + " in parents and not mimeType='application/vnd.google-apps.folder'"
        # saves return value (dictionary) to variable
        loopreturn = service.files().list(q=loopquery,
                                          spaces='drive',
                                          fields='files(id, name)').execute()
        loopreturn2 = service.files().list(q=loopquery2,
                                          spaces='drive',
                                          fields='files(id, name)').execute()
        loopappend = (loopreturn['files'])
        loopappend2 = (loopreturn2['files'])
        # appends list of dictionaries to listofdictFolders
        listofdictFolders.append(['Parent Folder Title: ' + str(strip2[i]['name']), loopappend])
        listofdictFiles.append(['Parent Folder Title: ' + str(strip2[i]['name']), loopappend2])

mapFolderContents(blankJobFolderID)
pprint.pprint(listofdictFiles)
print('')
pprint.pprint(listofdictFolders)

Output:

Now indexing subfolder 1...
[['Parent Folder Title: Root',
  [{'id': 'subfolder 1 ID', 'name': 'subfolder 1'},
   {'id': 'subfolder 2 ID', 'name': 'subfolder 2'},
   {'id': 'subfolder 3 ID', 'name': 'subfolder 3'}]],
 ['Parent Folder Title: subfolder 1',
  [{'id': 'sub-subfolder1 ID', 'name': 'sub-subfolder 1'},
   {'id': 'sub-subfolder2 ID', 'name': 'sub-subfolder 2'}]]]

[['Parent Folder Title: Venue',
  [{'id': 'sub-file 1 ID',
    'name': 'sub-file 1'}]]]

Process finished with exit code 0

您可以使用递归 BFS 来检索所有文件和文件夹

这是我的方法:

def getChildrenFoldersByFolderId(folderid):
  folderquery = "'" + folderid + "'" + " in parents and mimeType='application/vnd.google-apps.folder'"
  childrenFoldersDict = service.files().list(q=folderquery,
                                              spaces='drive',
                                              fields='files(id, name)').execute()

  return childrenFoldersDict['files']

def getChildrenFilesById(folderid):
  notfolderquery = "'" + folderid + "'" + \
                    " in parents and not mimeType='application/vnd.google-apps.folder'"
  childrenFilesDict = service.files().list(q=notfolderquery,
                                            spaces='drive',
                                            fields='files(name, id)').execute()

  return childrenFilesDict['files']

def getParentName(folderid):
  # retrieves parent name from folderid
  parentfolder = service.files().get(fileId=folderid).execute()
  parentname = 'Title: %s' % parentfolder['name']

  return parentname

def bfsFolders(queue=[]):
  listFilesFolders = {}
  while len(queue) > 0:
    
    currentFolder = queue.pop()
    childrenFolders = getChildrenFoldersByFolderId(currentFolder['id'])
    childrenFiles = getChildrenFilesById(currentFolder['id'])
    parentName = getParentName(currentFolder['id'])
    listFilesFolders['folderName'] = currentFolder['name']
    listFilesFolders['folderId'] = currentFolder['id']
    listFilesFolders['parentName'] = parentName
    if len(childrenFiles) > 0:
      listFilesFolders['childrenFiles'] = childrenFiles

    if len(childrenFolders) <= 0:
      return listFilesFolders

    listFilesFolders['childrenFolders'] = []
    for child in childrenFolders:
      queue.append(child)
      listFilesFolders['childrenFolders'].append(bfsFolders(queue))
    
  return listFilesFolders



filesAndFolders = bfsFolders([{'id': "ASDASDASDASDVppeC1zVVlWdDhkASDASDQ", 'name': 'folderRoot'}])

pprint.pprint(filesAndFolders)

首先将函数分开以简化脚本。完成此操作后,通过使用根节点作为包含文件夹 ID 和名称的参数来使用 BFS。

广度优先搜索递归地使用称为 的 FIFO 列表列出文件文件夹其中包含一本字典。一旦设置了字典,它将返回节点(字典本身),除非有更多文件夹要“扩展”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID 的相关文章

  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • 在 python 3 中使用子进程

    我使用 subprocess 模块在 python 3 中运行 shell 命令 这是我的代码 import subprocess filename somename py in practical i m using a real fil
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f
  • Python 使用 Gstreamer 访问 USB 麦克风时遇到问题,以便在 Raspberry Pi 上使用 Pocketsphinx 执行语音识别

    所以Python的表现就好像它根本听不到我的麦克风发出的任何声音 问题就在这里 我有一个Python 2 7 假设使用的脚本Gstreamer通过以下方式访问我的麦克风并为我进行语音识别口袋狮身人面像 我在用着脉冲音频我的设备是树莓派 我的
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 更改 x 轴比例

    我使用 Matlab 创建了这个图 使用 matplotlib x 轴绘制大数字 例如 100000 200000 300000 我想要 1 2 3 和 10 5 之类的值来指示它实际上是 100000 200000 300000 有没有一
  • 如何从下面的html中提取数据?

    我想要从中提取数据的 Html 是 div class infoMessageInner p span class ng binding Fiber r best lld till adressen Tj nsterna kan du be
  • CNTK 抱怨 LSTM 中的动态轴

    我正在尝试在 CNTK 中实现 LSTM 使用 Python 来对序列进行分类 Input 特征是固定长度的数字序列 时间序列 标签是 one hot 值的向量 Network input input variable input dim
  • Alembic:如何迁移模型中的自定义类型?

    My User模型是 class User UserMixin db Model tablename users noinspection PyShadowingBuiltins uuid Column uuid GUID default
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • 对使用 importlib.util 导入的对象进行酸洗

    我在使用Python的pickle时遇到了一个问题 我需要通过将文件路径提供给 importlib util 来加载一些 Python 模块 如下所示 import importlib util spec importlib util sp
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 在 Windows 上使用带有对数刻度的 matplotlib 时出现 Unicode 错误

    我正在使用 python 2 6 和 matplotlib 如果我运行 matplotlib 库页面中提供的示例 histogram demo py 它工作正常 我已经大大简化了这个脚本 import numpy as np import
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • tkinter:打开一个带有按钮提示的新窗口[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 用户如何按下 tkinter GUI 中的按钮来打开新窗口 我只需要非常简单的解决方案 如果代码也能被解释那就太好了 这
  • python 中的 after() 与 update()

    我是 python 新手 开始使用 tkinter 作为画布 到目前为止 我使用 update 来更新我的画布 但还有一个 after 方法 谁能给我解释一下这个函数 请举个例子 两者之间有什么区别 root after integer c

随机推荐

  • 从 mysql 数据库填充 Php 下拉列表[重复]

    这个问题在这里已经有答案了 我正在尝试从 mysql 数据库表填充下拉列表 这是代码 div class form group Select Make div
  • URL 缩短器:最佳编码方法?

    我正在创建一个链接缩短服务 并使用增量 ID 字段的 Base64 编码 解码来创建我的 url ID 为 6 的 url 为 http mysite com Ng http mysite com Ng 我还需要允许用户创建自定义网址名称
  • 来自模型和控制器的 cakephp 验证

    我已经在模型中进行了验证 另外 我在控制器中进行了一些验证以检查验证码 此后 应用程序不再显示模型验证错误 如果我评论控制器代码 模型验证工作正常并显示错误 两个都不行 型号代码 示例 class User extends AppModel
  • 如何直接从 Cython 调用 numpy/scipy C 函数,而不需要 Python 调用开销?

    我正在尝试在 Cython 中进行计算 该计算严重依赖于一些 numpy scipy 数学函数 例如numpy log 我注意到 如果我在 Cython 中的循环中重复调用 numpy scipy 函数 则会产生巨大的开销 例如 impor
  • 在页面上显示 # 个视图,而无需始终访问数据库

    越来越多的网站显示某些页面收到的浏览量 以及点击次数 如 dzone com 跟踪视图而不每次加载都访问数据库的最佳实践是什么 我脑子里有很多关于如何做到这一点的潜在想法 但似乎没有一个可行 谢谢 首次使用的用户 我会首先尝试数据库方法 返
  • android中如何从静态方法调用非静态方法

    我在从静态方法调用非静态方法时面临一个大问题 这是我的代码 Class SMS public static void First function SMS sms new SMS sms Second function public voi
  • Ansible sudo 在执行 5 个任务后挂起

    设置要求 本地用户 goagent1 ansible从GoCD启动 远程用户 myadmin myadmin 是一个需要密码的 sudoer 我们在剧本级别启用了 sudo Problem 该剧本似乎在执行了大约 5 个任务后停止了 发生得
  • “混合声明和代码”警告,值得解决吗?

    我最近启用了 pedanticgcc 上的选项 现在我收到大约两三页的 ISO C90 禁止混合声明和代码 警告 我这个项目的目标是能够将其部署在任何主流系统带有 C 编译器 所以我意识到假设 C99 将在所有地方都受支持是不明智的 但是是
  • Macvim 默认不会加载特定的配色方案

    我遇到了类似的问题VIM 配色方案默认不加载 https stackoverflow com questions 2637929 vim color scheme not loading by default 除了我遇到了这里找到的 gen
  • jQuery getJSON 将结果保存到变量中[重复]

    这个问题在这里已经有答案了 我使用 getJSON 从我的网站请求 JSON 它工作得很好 但我需要将输出保存到另一个变量中 如下所示 var myjson getJSON http 127 0 0 1 8080 horizon updat
  • 如何在 Eclipse 中使用 JavaFX 2 SDK?

    我已经安装了 JavaFX 2 0 SDK 现在我想使用 Eclipse 制作一个 JavaFX 应用程序 但我该如何使用javafx Eclipse 中的类 The 官方 JavaFX Eclipse 插件 http docs oracl
  • C# 7.0 独立丢弃混淆

    我想更好地理解几个涉及 C 7 0 丢弃功能的使用的示例 他们都利用所谓的单独丢弃 https learn microsoft com en us dotnet csharp discards a standalone discard 这是
  • CQRS 对于我的域是否正确?

    我正在对一个档案进行建模 它是视频点播系统的一部分 将存档想象成 Windows 资源管理器 其中多个用户可以创建文件夹 上传视频 重组文件夹等 有业务规则 权限 确定是否允许用户执行任务 即重命名文件夹 移动文件夹 查看文件夹等 我已将每
  • 如何减少 Hybris 服务器的启动时间?

    我正在研究一个Hybris项目这是非常耗时的等待 350 550 秒对于单个Hybris服务器启动 即使只是代码中的一点修改 错误输入 是否有可能reduce this time仅运行我修改过的扩展或任何其他方式 那将是一件很棒的事情 在
  • DirectX Release 构建可以通过 VS2010 运行,但不能运行 exe

    我已经通过 Google 访问 Stack Overflow 几年了 但到目前为止还没有询问 回答任何问题 所以就到这里吧 基本上 我有一个在 DirectX 11 中设置绘图模型和地形的 3D 渲染框架 一切正常 通过 Visual St
  • 当前上下文中不存在名称“isPost”(带有 Razor 的 ASP.NET)

    我正在尝试遵循有关 Razor 入门的 Microsoft 文档 https learn microsoft com en us aspnet web pages overview getting started introducing r
  • 如何使用VBA在Excel中保持第一个单元格始终处于活动状态

    如何在打开 Excel 工作表时保持第一个单元格始终处于活动状态 任何人都可以指导我如何做到这一点 这是我的 代码 Private Sub Send Click Dim strURL As String strURL http xxxxxx
  • UIFont - 如何获取系统细字体

    UIFont有方法获取常规字体 systemFontOfSize 或粗体 boldSystemFontOfSize 但是如何通过情节提要获得可用的 瘦系统字体 将 系统精简 传递给UIFont构造函数不起作用 该构造函数仅适用于非系统字体
  • Django 开发将 HttpResponses 记录到开发服务器

    我正在使用 Django 创建一个 API 每个视图都以 JSON 形式响应 我想将每个 HttpResponse JSON 记录到开发服务器输出 到目前为止我已经添加了一个处理程序 console level DEBUG class lo
  • 在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID

    我正在尝试编写一个程序来将文件夹和所有内容 包括子文件夹等 复制到另一个文件夹 我可能过于复杂化了 但我觉得第一步是获取与它们关联的所有文件名和 ID 并将它们保存到两个列表中 一个用于文件 一个用于文件夹 我无法让我的程序递归地遍历所有子