Как я могу программно загружать определенные файлы с диска Google с помощью python

У меня около 100 тысяч файлов в разных папках на моем гугл диске. Я хочу загрузить из него определенные файлы. Путь к файлам на диске Google находится внутри CSV.

Но как я могу получить идентификаторы файла? Я попробовал следующее.

import pandas as pd
from apiclient import errors
#from pygdrive3 import service


def retrieve_all_files(service):
  """Retrieve a list of File resources.

  Args:
    service: Drive API service instance.
  Returns:
    List of File resources.
  """
  result = []
  page_token = None
  while True:
    try:
      param = {}
      if page_token:
        param['pageToken'] = page_token
      files = service.files().list(**param).execute()

      #result.extend(files['items'])
      idval = files.get('id')
      if not idval:
        break
    except errors.HttpError.error:
      print ('An error occurred: %s' % error)
      break
  return idval


df = pd.read_csv("/home/ram/Downloads/Data_Science/Kaggle Competition/BBox_List_2017_path_colab.csv",header=None)
print(df.head())
for i in df[0]:
    request = drive_service.files()
    result = retrieve_all_files(request)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print ("Download %d%%." % int(status.progress() * 100))

Но ошибка говорит, drive_service is not defined. Ниже мой csv

                                                   0           1  ...           4            5
0  /content/drive/My Drive/nihxray/images_001/ima...  225.084746  ...   79.186441  Atelectasis
1  /content/drive/My Drive/nihxray/images_001/ima...  686.101695  ...  313.491525  Atelectasis
2  /content/drive/My Drive/nihxray/images_001/ima...  221.830508  ...  216.949153  Atelectasis
3  /content/drive/My Drive/nihxray/images_001/ima...  726.237288  ...   55.322034  Atelectasis
4  /content/drive/My Drive/nihxray/images_001/ima...  660.067797  ...   78.101695  Atelectasis

Я загружаю только те файлы, которые указаны выше в csv. Как я могу сделать это в python. Любая помощь приветствуется


person Fasty    schedule 29.04.2020    source источник
comment
Чтобы использовать thedrive_service, вы должны сначала создать его, как описано здесь. Ваша функция ожидает service в качестве параметра, drive_service нигде в вашем коде не определено.   -  person ziganotschka    schedule 29.04.2020
comment
Я сделал это на самом деле, но я не получил ни одного URL-адреса, который я мог бы открыть в новом браузере! Как объяснено при запуске python quckstart.py   -  person Fasty    schedule 29.04.2020
comment
Получили ли вы URL-ссылку для авторизации в консоли после успешного запуска кода? Затем скопируйте и вставьте его вручную в браузер, как описано здесь. ?   -  person ziganotschka    schedule 29.04.2020
comment
Вот что я хотел сказать, я не понял! Я включил API-интерфейс привода для рабочего стола, а не для веб-браузера. Это связано с этим?   -  person Fasty    schedule 29.04.2020
comment
Но могли бы вы запустить свой код без ошибок?   -  person ziganotschka    schedule 29.04.2020
comment
да, я мог, и он показал файлы!   -  person Fasty    schedule 29.04.2020
comment
Давайте продолжим обсуждение в чате.   -  person ziganotschka    schedule 29.04.2020
comment
У вас есть список идентификаторов? В вашем CSV-файле их нет, так как же вы сравниваете файлы, указанные в CSV-файле, с файлами на Диске?   -  person Rafa Guillermo    schedule 29.04.2020


Ответы (2)


Вот два фрагмента из асинхронного клиента API Google. Возможно, вам больше подойдет этот, поскольку он позволит вам загружать несколько файлов одновременно:

Список файлов (по идентификатору): https://github.com/omarryhan/aiogoogle/blob/master/examples/list_drive_files.py

Загрузите файлы: https://github.com/omarryhan/aiogoogle/blob/master/examples/download_drive_file.py

person Charming Robot    schedule 02.05.2020

Есть гораздо более простой способ, который имеет больше смысла. после установки Python и Gam вы можете запустить скрипт, который использует идентификатор файла с диска Google в файле csv для экспорта всех документов из списка. После установки python и gam вам нужно будет установить некоторые модули для работы скрипта. Когда вы запускаете скрипт, коды ошибок можно гуглить, чтобы увидеть, что нужно установить в Python. Также вам нужно будет создать учетную запись службы учетных данных API и заменить имя этой учетной записи в сценарии в обоих местах. Запустите cmd от имени администратора с помощью следующей команды с именем сценария script.py. "C:\Users\dcahoon\AppData\Local\Programs\Python\Python38\python.exe C:\GAM\SCRIPT.PY ** запуск сценария

import os
import subprocess

from csv import writer
from csv import reader

# path to googleidlist.csv
csvfile = 'c:\\GAM\\googleidlist.csv'
destination = 'c:\\GAM\\OUTPUT\\'      #Destination for downloaded documents


# Open the input_file in read mode and output_file in write mode
with open(csvfile, 'r') as read_obj, \
        open('output_1.txt', 'w', newline='') as write_obj:
    # Create a csv.reader object from the input file object
    csv_reader = reader(read_obj)
    # Create a csv.writer object from the output file object
    csv_writer = writer(write_obj)
    # Read each row of the input csv file as list
    for row in csv_reader:
         file_id = row[0]
        outcome = subprocess.Popen(['gam', 'user', 'googleserviceaccountname', 'get', 'drivefile', 'id', file_id, 'targetfolder',destination], stdout=subprocess.PIPE)
        # os.system("gam user [email protected] show fileinfo "+ file_id + "name")
        filename = subprocess.Popen(['gam', 'user', 'googleserviceaccountname', 'show', 'fileinfo', file_id, 'name' ], stdout=subprocess.PIPE)
        output = outcome.stdout.readline()
        file_name = filename.stdout.readline()
        print(output)
        # Append the default text in the row / list
        # row.append(filename)
        row.append(output)
        row.append(file_name)
        row.append(file_id)

        # Add the updated row / list to the output file
        csv_writer.writerow(row)
person Dan    schedule 08.05.2020