2016-07-21 4 views
3

Я пытаюсь загрузить файлы с Google Drive, и все, что у меня есть, - это адрес диска.Python: загружать файлы с Google Drive с помощью url

Я читал о google api, в котором рассказывается о каком-то драйвере и MedioIO, который также требует некоторых учетных данных (в основном json file/oauth). Но я не могу понять, как это работает.

Также, попробовал urllib2 urlretrieve, но мой случай - получить файлы с диска. Пробовал «wget» тоже, но бесполезно.

Пробовал библиотеки pydrive. Он имеет хорошие функции загрузки, а не параметры загрузки.

Любая помощь будет оценена по достоинству. Спасибо.

ответ

1

PyDrive позволяет скачать файл с помощью функции GetContentFile(). Вы можете найти документацию функции here.

Смотрите пример ниже:

# Initialize GoogleDriveFile instance with file id. 
file_obj = drive.CreateFile({'id': '<your file ID here>'}) 
file_obj.GetContentFile('cats.png') # Download file as 'cats.png'. 

Этот код предполагает, что вы прошедшему проверку подлинности drive объекта, то документы по этому вопросу можно найти here и here.

В общем случае это делается так:

from pydrive.auth import GoogleAuth 

gauth = GoogleAuth() 
# Create local webserver which automatically handles authentication. 
gauth.LocalWebserverAuth() 

# Create GoogleDrive instance with authenticated GoogleAuth instance. 
drive = GoogleDrive(gauth) 

Информация о молчаливом аутентификации на сервере можно найти here и включает в себя написание settings.yaml (пример: here), в котором вы сохраните данные для проверки подлинности.

+1

Ваш ответ более интересен –

+0

первая ссылка сломана :( – Joe

+0

@Joe установил связь! –

6

Если по "URL привода" вы имеете в виду доступ по ссылке файла на Google Диске, то следующее может помочь:

import requests 

def download_file_from_google_drive(id, destination): 
    URL = "https://docs.google.com/uc?export=download" 

    session = requests.Session() 

    response = session.get(URL, params = { 'id' : id }, stream = True) 
    token = get_confirm_token(response) 

    if token: 
     params = { 'id' : id, 'confirm' : token } 
     response = session.get(URL, params = params, stream = True) 

    save_response_content(response, destination)  

def get_confirm_token(response): 
    for key, value in response.cookies.items(): 
     if key.startswith('download_warning'): 
      return value 

    return None 

def save_response_content(response, destination): 
    CHUNK_SIZE = 32768 

    with open(destination, "wb") as f: 
     for chunk in response.iter_content(CHUNK_SIZE): 
      if chunk: # filter out keep-alive new chunks 
       f.write(chunk) 

if __name__ == "__main__": 
    file_id = 'TAKE ID FROM SHAREABLE LINK' 
    destination = 'DESTINATION FILE ON YOUR DISK' 
    download_file_from_google_drive(file_id, destination) 

пропущено не использует pydrive, ни Google Drive SDK. Он использует модуль requests (который каким-то образом является альтернативой urllib2).

При загрузке больших файлов с Google Диска одного запроса GET недостаточно. Требуется второй - см. wget/curl large file from google drive.

+0

работы, хорошая работа – United121

0

Это также было описано выше,

from pydrive.auth import GoogleAuth 
    gauth = GoogleAuth() 
    gauth.LocalWebserverAuth() 
    drive = GoogleDrive(gauth) 

Это создает свой собственный сервер тоже делать грязную работу аутентичности

file_obj = drive.CreateFile({'id': '<Put the file ID here>'}) 
    file_obj.GetContentFile('Demo.txt') 

Это загружает файл

1

Имея аналогичные потребности многих раз, я сделал дополнительный простой класс GoogleDriveDownloader, начинающийся с фрагмента с @ user115202 выше. Вы можете найти исходный код here.

Вы также можете установить его через пип:

pip install googledrivedownloader 

Тогда использование так же просто, как:

from google_drive_downloader import GoogleDriveDownloader as gdd 

gdd.download_file_from_google_drive(file_id='1iytA1n2z4go3uVCwE__vIKouTKyIDjEq', 
            dest_path='./data/mnist.zip', 
            unzip=True) 

Этот фрагмент кода будет загрузить архив совместно в Google Drive. В этом случае 1iytA1n2z4go3uVCwE__vIKouTKyIDjEq является идентификатором разделяемой ссылки, полученной с Google Диска.

0
def download_tracking_file_by_id(file_id, download_dir): 
    gauth = GoogleAuth(settings_file='../settings.yaml') 
    # Try to load saved client credentials 
    gauth.LoadCredentialsFile("../credentials.json") 
    if gauth.credentials is None: 
     # Authenticate if they're not there 
     gauth.LocalWebserverAuth() 
    elif gauth.access_token_expired: 
     # Refresh them if expired 
     gauth.Refresh() 
    else: 
     # Initialize the saved creds 
     gauth.Authorize() 
    # Save the current credentials to a file 
    gauth.SaveCredentialsFile("../credentials.json") 

    drive = GoogleDrive(gauth) 

    logger.debug("Trying to download file_id " + str(file_id)) 
    file6 = drive.CreateFile({'id': file_id}) 
    file6.GetContentFile(download_dir+'mapmob.zip') 
    zipfile.ZipFile(download_dir + 'test.zip').extractall(UNZIP_DIR) 
    tracking_data_location = download_dir + 'test.json' 
    return tracking_data_location 

Вышеупомянутая функция загружает файл с именем file_id в указанную папку для загрузки. Теперь остается вопрос, как получить файл_ид? Просто разделите url на id =, чтобы получить file_id.

file_id = url.split("id=")[1] 
Смежные вопросы