Ошибка Pydrive: в метаданных не найдено downloadLink/exportLinks для mimetype

Я пытаюсь автоматически загрузить простой текстовый файл с Google Drive с помощью модуля pydrive для python. Я продолжаю получать следующую ошибку:

Трассировка (последний вызов был последним): файл "C:\GIS\AVGOPS\Scripts\GoogleDrive_Test.py", строка 20, в item.GetContentFile(r'C:\Users\pfilyer\Desktop\googedrive\' + item['title']) Файл "C:\Python27\ArcGIS10.4\lib\site-packages\pydrive\files.py", строка 210, в файле GetContentFile self.FetchContent(mimetype, remove_bom) Файл "C: \ Python27 \ ArcGIS10. 4 \ lib \ site-packages \ pydrive \ files.py ", строка 43, в _decorated return decoratee(self, *args, **kwargs) Файл" C: \ Python27 \ ArcGIS10.4 \ lib \ site-packages \ pydrive \ files.py ", строка 265, в FetchContent 'Нет ссылок на скачивание /exportLink для mimetype, найденных в метаданных') FileNotDownloadableError: Нет ссылок на скачивание /exportLink для mimetype, найденных в метаданных

Какие-либо предложения?

import pydrive
from pydrive.drive import GoogleDrive

from pydrive.auth import GoogleAuth

gauth = GoogleAuth()
gauth.LoadCredentialsFile(r"C:\Users\XXXXX\.credentials\drive-python-quickstart.json")
drive = GoogleDrive(gauth)

print "Auth Success"

folder_id = '0BxbuUXtrs7adSFFYMG0zS3VZNFE'
lister = drive.ListFile({'q': "'%s' in parents" % folder_id}).GetList()
for item in lister:
    print item['title']
    item.GetContentFile(r'C:\Users\XXXXX\Desktop\googedrive\\' +    item['title'])

1 ответ

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

Я получил точно такую ​​же ошибку несколько минут назад, когда пытался загрузить файл mimeType: application/vnd.google-apps.document. Документ должен быть экспортирован в другой формат перед загрузкой. Проверь это:

import pydrive
from pydrive.drive import GoogleDrive

from pydrive.auth import GoogleAuth

gauth = GoogleAuth()
gauth.LoadCredentialsFile(r"C:\Users\XXXXX\.credentials\drive-python-    quickstart.json")
drive = GoogleDrive(gauth)

print "Auth Success"

folder_id = '0BxbuUXtrs7adSFFYMG0zS3VZNFE'
lister = drive.ListFile({'q': "'%s' in parents" % folder_id}).GetList()
for item in lister:
    print(item['title'])
    # this should tell you which mimetype the file you're trying to download 
    # has. 
    print('title: %s, mimeType: %s' % (item['title'], item['mimeType']))
    mimetypes = {
        # Drive Document files as PDF
        'application/vnd.google-apps.document': 'application/pdf',

        # Drive Sheets files as MS Excel files.
        'application/vnd.google-apps.spreadsheet': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

    # see https://developers.google.com/drive/v3/web/mime-types
    }
    download_mimetype = None
    if file['mimeType'] in mimetypes:
        download_mimetype = mimetypes[file['mimeType']]
        file.GetContentFile(file['title'], mimetype=download_mimetype)

        item.GetContentFile(r'C:\Users\XXXXX\Desktop\googedrive\\' + item['title'], mimetype=download_mimetype)
    else: 
        item.GetContentFile(r'C:\Users\XXXXX\Desktop\googedrive\\' + item['title'])

Это должно работать.

Созданный на основе примеров в этом потоке, здесь скрипт, который просматривает все подпапки папки gdrive и загружает структуру папок и все файлы внутри. Заботится о документах, таблицах и презентациях gdrive. Регистрирует, если файл выходит из строя:)

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

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

MIMETYPES = {
        # Drive Document files as MS dox
        'application/vnd.google-apps.document': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        # Drive Sheets files as MS Excel files.
        'application/vnd.google-apps.spreadsheet': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        # Drive presentation as MS pptx
        'application/vnd.google-apps.presentation': 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
        # see https://developers.google.com/drive/v3/web/mime-types
    }
EXTENSTIONS = {
        'application/vnd.google-apps.document': '.docx',
        'application/vnd.google-apps.spreadsheet': '.xlsx',
        'application/vnd.google-apps.presentation': '.pptx'
}

f = open("failed.txt","w+")
folder_id = '<folder_id_from_browser_address_bar>'
root = 'drive_download'
os.mkdir(root)

def escape_fname(name):
    return name.replace('/','_')

def search_folder(folder_id, root):
    file_list = drive.ListFile({'q': "'%s' in parents and trashed=false" % folder_id}).GetList()
    for file in file_list:
        # print('title: %s, id: %s, kind: %s' % (file['title'], file['id'], file['mimeType']))
        # print(file)
        if file['mimeType'].split('.')[-1] == 'folder':
            foldername = escape_fname(file['title'])
            create_folder(root,foldername)
            search_folder(file['id'], '{}{}/'.format(root,foldername))
        else:
            download_mimetype = None
            filename = escape_fname(file['title'])
            filename = '{}{}'.format(root,filename)
            try:
                print('DOWNLOADING:', filename)
                if file['mimeType'] in MIMETYPES:
                    download_mimetype = MIMETYPES[file['mimeType']]

                    file.GetContentFile(filename+EXTENSTIONS[file['mimeType']], mimetype=download_mimetype)
                else:
                    file.GetContentFile(filename)
            except:
                print('FAILED')
                f.write(filename+'\n')

def create_folder(path,name):
    os.mkdir('{}{}'.format(path,escape_fname(name)))

search_folder(folder_id,root+'/')
f.close() 

При загрузке документов на диск Google убедитесь, что параметр "Преобразовать документы в формат редактора документов Google" не установлен в настройках диска Google. Это гарантирует, что загруженный вами файл будет в том же формате, что и ваш локальный (например, .csv, .txt и т. Д.). Для меня это сработало.

В моем случае это было потому, что было несколько файлов с одинаковыми именами и расширениями, но разными идентификаторами, я удалил один и код работает

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