Ошибка 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 и т. Д.). Для меня это сработало.
В моем случае это было потому, что было несколько файлов с одинаковыми именами и расширениями, но разными идентификаторами, я удалил один и код работает