J'essaie de télécharger des fichiers à partir de Google Drive et tout ce que j'ai, c'est l'URL du lecteur.
J'ai lu quelque chose sur Google Api qui parle de drive_service et de MedioIO, qui nécessite également des informations d'identification (principalement json fichier/oauth). Mais je suis incapable d’avoir une idée de son fonctionnement.
En outre, essayé urllret2 urlretrieve, mais mon cas est d'obtenir des fichiers à partir du lecteur. Essayé 'wget' aussi mais pas d'utilisation.
Essayé bibliothèque pydrive. Il possède de bonnes fonctions de téléchargement mais pas d’option de téléchargement.
Toute aide sera appréciée, merci.
Si vous entendez par "URL de l'unité" le lien partageable d'un fichier sur Google Drive, voici ce qui pourrait vous aider:
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 __== "__main__":
file_id = 'TAKE ID FROM SHAREABLE LINK'
destination = 'DESTINATION FILE ON YOUR DISK'
download_file_from_google_drive(file_id, destination)
Le snippé n'utilise cependant pas pydrive, ni le SDK Google Drive. Il utilise le module request (qui est en quelque sorte une alternative à urllib2).
Lors du téléchargement de fichiers volumineux à partir de Google Drive, une seule requête GET ne suffit pas. Un second est nécessaire - voir wget/curl un fichier volumineux à partir de google drive .
Ayant eu des besoins similaires à plusieurs reprises, j'ai créé une classe extra simple GoogleDriveDownloader
à partir du fragment extrait de @ user115202 ci-dessus. Vous pouvez trouver le code source ici .
Vous pouvez également l'installer via pip:
pip install googledrivedownloader
Ensuite, l'utilisation est aussi simple que:
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)
Cet extrait téléchargera une archive partagée dans Google Drive. Dans ce cas, 1iytA1n2z4go3uVCwE__vIKouTKyIDjEq
est l'id du lien que vous pouvez partager fourni par Google Drive.
PyDrive
vous permet de télécharger un fichier avec la fonction GetContentFile()
. Vous pouvez trouver la documentation de la fonction ici .
Voir exemple ci-dessous:
# 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'.
Ce code suppose que vous avez un objet drive
authentifié. Les documents correspondants peuvent être trouvés ici et ici .
Dans le cas général, cela se fait comme suit:
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)
Vous trouverez des informations sur l'authentification silencieuse sur un serveur ici et implique l'écriture d'un settings.yaml
(exemple: ici ) dans lequel vous enregistrez les détails de l'authentification.
# Importing [PyDrive][1] OAuth
from pydrive.auth import GoogleAuth
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
La fonction ci-dessus télécharge le fichier en fonction du file_id dans un dossier de téléchargement spécifié. Maintenant la question reste, comment obtenir le file_id? Il suffit de scinder l’url par id = pour obtenir le file_id.
file_id = url.split("id=")[1]
Cela a également été décrit ci-dessus,
from pydrive.auth import GoogleAuth
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
Cela crée son propre serveur aussi faire le sale boulot de l'authentification
file_obj = drive.CreateFile({'id': '<Put the file ID here>'})
file_obj.GetContentFile('Demo.txt')
Cela télécharge le fichier