Загрузка файлов из папки Google Диска на локальный диск C через Python

Я пытаюсь загрузить файл .csv, который заполняется в папку Google Диска с помощью процесса Microsoft Flow, который извлекает вложенный документ электронной почты каждые 6 часов по электронной почте. Я попытался следовать документации по использованию модуля Pydrive. Я знаю, как создать файл для загрузки и загрузки на Google Диск, но не знаю, как загрузить его на основе URL-адреса ссылки существующего файла. Вот мой код.

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

file_obj = drive.CreateFile({'id': '1j2vJVOB-_Xltmp9xkQJZzGb-5DAB_Imu'})
print(file_obj["title"], file_obj["mimeType"])
file_obj.GetContentFile('Assigned_Agency_AZS_Overhead_EXCEL.csv', mimetype='text/csv')

Сообщение об ошибке, которое я получаю.

    runfile('C:/Google_Python_Test/Google/Google_Drive1.py', wdir='C:/Google_Python_Test/Google')
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?client_id=1078392182164-kone7oddogt31qfcg1qvp5u13fc3tivi.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&access_type=offline&response_type=code

Authentication successful.
Overhead application/vnd.google-apps.folder
Traceback (most recent call last):

  File "<ipython-input-26-6344c96b3f6e>", line 1, in <module>
    runfile('C:/Google_Python_Test/Google/Google_Drive1.py', wdir='C:/Google_Python_Test/Google')

  File "C:\Users\shrevee\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:\Users\shrevee\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Google_Python_Test/Google/Google_Drive1.py", line 11, in <module>
    file_obj.GetContentFile('Assigned_Agency_AZS_Overhead_EXCEL.csv', mimetype='text/csv')

  File "C:\Users\shrevee\Anaconda3\lib\site-packages\pydrive\files.py", line 210, in GetContentFile
    self.FetchContent(mimetype, remove_bom)

  File "C:\Users\shrevee\Anaconda3\lib\site-packages\pydrive\files.py", line 43, in _decorated
    return decoratee(self, *args, **kwargs)

  File "C:\Users\shrevee\Anaconda3\lib\site-packages\pydrive\files.py", line 265, in FetchContent
    'No downloadLink/exportLinks for mimetype found in metadata')

FileNotDownloadableError: No downloadLink/exportLinks for mimetype found in metadata

person Eric Shreve    schedule 02.11.2018    source источник
comment
Возможный дубликат ошибка Pydrive: нет downloadLink/exportLinks для mimetype найдено в метаданных   -  person omri_saadon    schedule 02.11.2018
comment
Вы уверены, что это файл csv и что идентификатор правильный? Или это файл типа Google mime?   -  person Karl    schedule 02.11.2018
comment
Да, файл в формате csv, а также правильный идентификатор файла.   -  person Eric Shreve    schedule 02.11.2018
comment
@EricShreve, как видно из того, что распечатано, указанный идентификатор файла на самом деле неверен, это идентификатор папки «Накладные расходы», поэтому вы получаете сообщение об ошибке.   -  person Karl    schedule 03.11.2018


Ответы (1)


Возможно, вам потребуется указать тип MIME для файла, чтобы убедиться, что он загружает его правильно. Если вы абсолютно уверены, что файл является csv и не преобразован в документ Google, вы можете сделать это:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

file_obj = drive.CreateFile({'id': '1j2vJVOB-_Xltmp9xkQJZzGb-5DAB_Imu'})
file_obj.GetContentFile('Assigned_Agency_AZS_Overhead_EXCEL.csv', mimetype='text/csv')
person Karl    schedule 02.11.2018
comment
Карл, я получил FileNotDownloadableError: No downloadLink/exportLinks for mimetype found in metadata, когда попытался выполнить этот скрипт. - person Eric Shreve; 02.11.2018
comment
Вы пробовали text/csv в качестве MIME-типа? Я думаю, что это правильный вариант, основанный на этой проблеме github, связанной с загрузкой CSV. Кроме того, можете ли вы выполнить print(file_obj["title"], file_obj["mimeType"]) после выполнения drive.CreateFile() и показать результат? Таким образом, мы можем проверить, какой тип mimetype хранится в GDrive. - person Karl; 02.11.2018
comment
После выполнения этого file = drive.CreateFile({'id': '1j2vJVOB-_Xltmp9xkQJZzGb-5DAB_Imu'}) print(file_obj["title"], file_obj["mimeType"]) file.GetContentFile('Assigned_Agency_AZS_Overhead_EXCEL.csv', mimetype='text/csv') я все еще получаю сообщение об ошибке No downloadLink/exportLinks - person Eric Shreve; 02.11.2018
comment
Но что он распечатал? Это было целью заявления печати. Он выведет имя файла и mimeType, которые можно использовать, чтобы выяснить, что не так. - person Karl; 02.11.2018
comment
После добавления вашего кода я получил это в консоли. file_obj = drive.CreateFile({'id': '1j2vJVOB-_Xltmp9xkQJZzGb-5DAB_Imu'}) print(file_obj["title"], file_obj["mimeType"]) file_obj.GetContentFile('Assigned_Agency_AZS_Overhead_EXCEL.csv', mimetype='text/csv') Я не получаю результат печати. - person Eric Shreve; 02.11.2018
comment
Я обновил исходный вопрос сообщением об ошибке, которое я получаю в консоли. - person Eric Shreve; 02.11.2018
comment
Как вы можете видеть, что было распечатано, вы загружаете не CSV, а папку. Overhead application/vnd.google-apps.folder показывает, что mimeType того, что вы пытаетесь загрузить, является папкой. Вам нужно указать идентификатор файла. - person Karl; 02.11.2018
comment
Это сработало, изменив идентификатор на фактический файл CSV. Но процесс, который я пытаюсь сделать, — это загружать новый CSV-файл каждые 6 часов, а затем загружать его локально на мою машину, используя тот же каталог Google Диска через Microsoft Flow. Идентификатор CSV меняется каждый раз, поэтому этот процесс не будет работать, если я попытаюсь автоматизировать его с помощью планировщика задач Windows. Есть ли способ загрузить все файлы в папку Google Диска через рабочий процесс PyDrive? - person Eric Shreve; 03.11.2018
comment
Вы можете запросить все файлы в этой папке и загрузить любые из них, имеющие тип csv или соответствующие заголовку имени файла, который вы ищете. - person Karl; 03.11.2018
comment
Глупый вопрос от меня. У вас есть фрагменты кода, чтобы указать мне правильное направление? - person Eric Shreve; 03.11.2018
comment
file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".format(folder_id)}).GetList(), где folder_id — идентификатор родительской папки. Он вернет список каждого файлового объекта в папке, который вы можете просмотреть, чтобы затем получить файл csv и загрузить его. Поскольку эта проблема отличается от текущей (и эта, кажется, решена), пожалуйста, задайте ее в другом вопросе, если у вас возникнут проблемы. - person Karl; 03.11.2018