Некоторые файлы отсутствуют в Google Drive API v3 Python files (). List ()

Я новичок в использовании Google Drive API для Python (v3), и я пытался получить доступ и обновить подпапки в определенной родительской папке, для которой у меня есть 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 вместо файла python.
  • Я названный соавтор с правом записи во все подпапки, включая ту, которая не отображается.

ОБНОВЛЕНИЯ

  • Запрос files().list() использовался для возврата 40 записей из 41 в папке. Сейчас возвращается только 39.
  • Обе папки, которые больше не возвращаются, были переименованы кем-то, кто получил доступ к папке с помощью ссылки, расширяющей права на запись.
  • Когда сведения об их папках запрашиваются напрямую с помощью files().get(), обе невозвращенные папки по-прежнему имеют родительскую папку в качестве единственной родительской, и их разрешения не изменились.

Основные вопросы:

  1. Почему этот файл, родительский идентификатор которого явно указан в моем запросе file().list(), не отображается в результатах этого запроса? И есть ли способ настроить запрос или файл, чтобы убедиться, что это так?
  2. Есть ли более простой способ перечислить все файлы, содержащиеся в папке, в Google Drive API v3? Я знаю, что в версии 2 был метод children() для папок, но, насколько мне известно, в версии 3 он устарел.

Как вы дважды проверяли, нет ли nextpagetoken, когда вы исключаете его из своих полей?

DaImTo 13.09.2018 18:23

Я запустил results.keys(), и единственный возвращенный ключ был 'files и, согласно этой документации: developers.google.com/drive/api/v3/reference/files/list, этот ключ отсутствует в возвращаемом объекте, если нет нескольких страниц.

William Daly 13.09.2018 18:27

@DaImTo Я только что обновил исходный пост, чтобы включить дополнительную информацию о nextPageToken и incompleteSearch

William Daly 13.09.2018 18:38

fields = 'parent, name' - это запрос частичного ответа, который вы не включили туда, потому что вы никогда его не увидите. попробуйте fields = '*'

DaImTo 13.09.2018 21:27

@DaImTo Проблема не в методе files().get(), а в files().list(), и я включил nextPageToken в список полей, и он по-прежнему недоступен в результатах этого запроса.

William Daly 13.09.2018 21:55

Думаю, вам нужно показать мне пример. У меня есть x файлов в этой папке, и только y возвращается. есть ли проблема с правами доступа к отсутствующим файлам?

DaImTo 14.09.2018 08:53

Кому принадлежит пропавшая папка? Попробуйте установить pageSize = 1 в своем запросе, чтобы несколько страниц с nextPageTokens проверяли логику вашей программы.

pinoyyid 14.09.2018 13:17

@DaImTo Пример указан в исходном посте. В родительской папке с идентификатором 1QXPl6z04GsYAO0GKHBk2oBjEweaAbczw находится 41 файл, и теперь только 39 не возвращаются в запросе files().list(), когда я фильтрую файлы, у которых есть родительские файлы с этим идентификатором.

William Daly 14.09.2018 18:17

@pinoyyid, проблема не в нескольких страницах, потому что вчера files().list() вернул 40 записей, сегодня - только 39, а запись, которая больше не отображается в списке сегодня, также была переименована соавтором. Я добавлю этот новый паттерн в исходный пост

William Daly 14.09.2018 18:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
1 332
1

Ответы 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 ...? Или их нужно оценивать как отдельные состояния, например, fileId1 in parents or fileId2 in parents?

Если бы кто-то мог прокомментировать этот ответ с этими объяснениями или опубликовать более полный ответ, я бы с удовольствием выбрал его как лучший ответ.

чтобы ответить на ваш первый вопрос, возможно, стоит ПОЛУЧИТЬ файл и просмотреть его родительскую коллекцию. Предполагается, что ваш первоначальный синтаксис каким-то образом соответствовал только первому элементу родителей. На 2, как вы теперь знаете, это «идентификатор в родительских элементах», поэтому вам просто нужно связать предложения вместе с or.

pinoyyid 15.09.2018 00:19

@pinoyyid Спасибо! Я проверил родителей папки до и после изменения имени, похоже, что способ хранения списка родителей не изменился, но, по крайней мере, я знаю, как раньше избегать этой проблемы. И вот что, это имеет смысл, но, похоже, не позволяет легко параметризовать запросы.

William Daly 18.09.2018 19:18

Другие вопросы по теме