【问题标题】:Certain files missing in Google Drive API v3 Python files().list()Google Drive API v3 Python files().list() 中缺少某些文件
【发布时间】:2018-09-13 16:08:35
【问题描述】:

我是使用 Python (v3) 的 Google Drive API 的新手,我一直在尝试访问和更新我拥有 fileId 的特定父文件夹中的子文件夹。这是我为 API 驱动程序构建的版本:

store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('credentials.json',
           scope='https://www.googleapis.com/auth/drive')
    creds = tools.run_flow(flow, store)
service = build('drive', 'v3', http=creds.authorize(Http()))

我能够使用files().list() 成功访问大部分子文件夹,但返回的结果列表中至少缺少一个:

results = service.files().list(
    q="parents in '1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw'", 
    fields="files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']

我仔细检查了结果中没有nextPageToken 键,incompleteSearch 的值是False,我认为这意味着返回了完整的结果列表。此外,当我使用file().get() 方法访问丢失文件的父级列表时,列出的唯一父级是上面查询中的那个:

service.files().get(
    fileId='1WHP02DtXfJHfkdr47xSeeRIj0sCrihPA',
    fields='parents, name').execute()

并返回:

{'name': 'Sara Gaul -Baltimore Corps docs and schedules',
 'parents': ['1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw']}

其他可能相关的细节:

  • 协作者重命名了未出现在列表中的特定文件夹。
  • 我在 jupyter notebook 上运行此代码,而不是从 python 文件。
  • 我是指定的协作者,对所有子文件夹(包括未显示的文件夹)具有写入权限。

更新

  • files().list() 查询用于返回文件夹中 41 条记录中的 40 条记录。现在它只返回 39。
  • 不再返回的两个文件夹都由使用扩展写入级别权限的链接访问文件夹的人重命名。
  • 当直接使用files().get()查询它们的文件夹详细信息时,两个未返回的文件夹仍然将父文件夹作为其唯一的父文件夹,并且它们的权限没有改变。

主要问题:

  1. 为什么在我的file().list() 查询中明确列出了父 ID 的文件没有显示在该查询的结果中?是否有任何方法可以调整查询或文件以确保它确实如此?
  2. 有没有更简单的方法来列出 Google Drive API v3 中文件夹中包含的所有文件?我知道 v2 有一个用于文件夹的 children() 方法,但据我所知,它在 v3 中已被弃用

【问题讨论】:

  • 当你从你的字段中排除它时,你是如何仔细检查没有 nextpagetoken 的?
  • 我运行了results.keys(),返回的唯一键是'files,根据此文档:developers.google.com/drive/api/v3/reference/files/list 如果没有多个页面,则返回的对象中不存在该键
  • @DaImTo 我刚刚更新了原始帖子以包含有关nextPageTokenincompleteSearch 的更多信息
  • fields='parents, name' 是一个请求部分响应,您没有在其中包含 nextpagetoken ,因为您永远不会看到它。试试 fields='*'
  • @DaImTo 问题不在于files().get() 方法,而在于files().list(),我将 nextPageToken 包含在字段列表中,但在该查询的结果中仍然不可用

标签: python google-drive-api


【解决方案1】:

我发现了我的代码的错误:

我之前在files().list()方法中的查询参数是:

results = service.files().list(
    q="parents in '1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw'", 
    fields="files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']

在查看有人在 Google 的 API 问题跟踪器中发布的另一个错误后,我看到该查询的首选语法是:

results = service.files().list(
    q="'1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw' in parents", 
    fields="files(id, name), incompleteSearch, nextPageToken").execute()
items = results['files']

换句话说,将parents in fileId 的顺序切换为fileId in parents。随着语法的改变,所有 41 个文件都被返回。

我有两个后续问题希望有人能澄清一下:

  1. 如果第一个语法不正确,为什么会返回任何记录?为什么更改文件名会阻止使用第一种语法返回它?
  2. 如果您想返回存储在几个文件夹之一中的文件列表,有没有办法像parents in ... 语法所建议的那样将多个父 ID 传递给查询?还是必须将它们作为单独的条件进行评估,即fileId1 in parents or fileId2 in parents

如果有人可以用这些解释评论这个答案或发布更完整的答案,我很乐意将其选为最佳回复。

【讨论】:

  • 回答您的第一个问题可能值得获取文件并查看其父集合。猜测是您的初始语法仅在父母的第一个元素上以某种方式匹配。在 2 上,您现在知道,它是“父母中的 id”,因此您只需要将子句与 or 串在一起
  • @pinoyyid 谢谢!我在更改名称之前和之后检查了文件夹的父级,它似乎没有改变父级列表的存储方式,但至少我知道之前要避免这个问题。有问题,这是有道理的,但似乎不允许参数化查询很容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多