Как программно загрузить указанные c файлы с Google Drive с помощью python - PullRequest
0 голосов
/ 29 апреля 2020

У меня около 100 тысяч файлов в разных папках на моем диске Google. Я хочу скачать с него указанные c файлы. Путь к файлам на диске 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. Любая помощь оценена

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Есть гораздо более простой способ, который имеет больше смысла. после установки Python и Gam вы можете запустить скрипт, который использует идентификатор файла с google drive в файле 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 david.bruinsma@colonialmed.com 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)
1 голос
/ 02 мая 2020

Вот два фрагмента из асинхронного c клиента 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

...