Google Colab: comment lire les données de mon Google Drive?


113

Le problème est simple: j'ai des données sur gDrive, par exemple sur /projects/my_project/my_data* .

J'ai aussi un simple cahier dans gColab.

Alors, j'aimerais faire quelque chose comme:

for file in glob.glob("/projects/my_project/my_data*"):
    do_something(file)

Malheureusement, tous les exemples (comme celui-ci - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , par exemple) suggèrent de ne charger que toutes les données nécessaires dans le notebook.

Mais, si j'ai beaucoup de données, cela peut être assez compliqué. Existe-t-il des possibilités de résoudre ce problème?

Merci pour l'aide!


9
Surprenant! personne n'a donné de lien vers ce carnet de notes Colab qui décrit toutes les méthodes disponibles à partir d'avril 2019 - colab.research.google.com/notebooks/io.ipynb
humain

Réponses:


60

Bonne nouvelle, PyDrive a un support de première classe sur CoLab! PyDrive est un wrapper pour le client python Google Drive. Voici un exemple sur la façon dont vous téléchargeriez TOUS les fichiers à partir d'un dossier, similaire à l'utilisation de glob+ *:

!pip install -U -q PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

# 1. Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

# choose a local (colab) directory to store the data.
local_download_path = os.path.expanduser('~/data')
try:
  os.makedirs(local_download_path)
except: pass

# 2. Auto-iterate using the query syntax
#    https://developers.google.com/drive/v2/web/search-parameters
file_list = drive.ListFile(
    {'q': "'1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk' in parents"}).GetList()

for f in file_list:
  # 3. Create & download by id.
  print('title: %s, id: %s' % (f['title'], f['id']))
  fname = os.path.join(local_download_path, f['title'])
  print('downloading to {}'.format(fname))
  f_ = drive.CreateFile({'id': f['id']})
  f_.GetContentFile(fname)


with open(fname, 'r') as f:
  print(f.read())

Notez que les arguments de drive.ListFilesont un dictionnaire qui coïncide avec les paramètres utilisés par l' API HTTP Google Drive (vous pouvez personnaliser leq paramètre à à votre cas d'utilisation).

Sachez que dans tous les cas, les fichiers / dossiers sont encodés par des identifiants (voir le 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) sur Google Drive. Cela nécessite que vous recherchiez dans Google Drive l'ID spécifique correspondant au dossier dans lequel vous souhaitez rooter votre recherche.

Par exemple, accédez au dossier "/projects/my_project/my_data"qui se trouve dans votre Google Drive.

Google Drive

Voyez qu'il contient des fichiers, dans lesquels nous voulons télécharger sur CoLab. Pour obtenir l'id du dossier afin de l'utiliser par PyDrive, regardez l'url et extrayez le paramètre id. Dans ce cas, l'url correspondant au dossier était:

https://drive.google.com/drive/folders/1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk

Où l'id est le dernier élément de l'url: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Je vous remercie! Ça marche vraiment! Et connaissez-vous des solutions pour copier tout le répertoire gDrive?
Scitator

@Scitator voulez-vous dire tous les fichiers de Google Drive?
wenkesj

@Scitator veuillez jeter un oeil à pythonhosted.org/PyDrive/… pour votre question
wenkesj

1
Merci pour la réponse. Cela fonctionne, mais je ne comprends pas quelque chose. La façon dont cela fonctionne maintenant (pour autant que je sache) est qu'il stocke les données sur le chemin donné sous "local_download_path" sur Google Drive! Mais les données sont déjà dans Google Drive (encodées par un identifiant de dossier spécifique). Pourquoi devons-nous faire cela? Je veux dire que le fichier / les fichiers sont déjà dans Google Drive !! J'ai essayé cette méthode pour lire un dossier contenant beaucoup d'images et mon ordinateur s'est figé! Quand j'ai exécuté ce code, il a en fait essayé de copier ENCORE toutes les images (qui sont déjà dans Google Drive) dans le "local_download_path" ??
TwinPenguins

1
Eh bien, j'ai fini par utiliser la deuxième réponse (voir ci-dessous). C'est super simple et facile. Dites-moi si vous rencontrez toujours des problèmes en utilisant les réponses ci-dessous.
TwinPenguins

252

Edit : Depuis février 2020, il existe désormais une interface utilisateur de première classe pour le montage automatique de Drive.

Tout d'abord, ouvrez le navigateur de fichiers sur le côté gauche. Il affichera un bouton «Mount Drive». Une fois que vous avez cliqué, vous verrez une invite d'autorisations pour monter Drive, et vos fichiers Drive seront ensuite présents sans configuration lorsque vous reviendrez sur le portable. Le flux terminé ressemble à ceci:

Exemple de montage automatique du lecteur

La réponse originale suit, ci-dessous. (Cela fonctionnera également pour les blocs-notes partagés.)

Vous pouvez monter vos fichiers Google Drive en exécutant l'extrait de code suivant:

from google.colab import drive
drive.mount('/content/drive')

Ensuite, vous pouvez interagir avec vos fichiers Drive dans le panneau latéral du navigateur de fichiers ou à l'aide des utilitaires de ligne de commande.

Voici un exemple de cahier


36
c'est la solution la plus simple pour monter votre gdrive sur google colab, je pense que cela devrait être la réponse acceptée
buncis

Réponse canonique, sympa. L'exemple de bloc-notes est en lecture seule et ne peut pas être utilisé directement. Faire File-> Save enregistrera un fichier sur le lecteur.
BSalita

Comment monter un autre niveau? par exemple. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

Devez-vous vous authentifier à chaque fois que vous connectez votre lecteur Google?
Frank Meulenaar

@FrankMeulenaar yes
DB

31

Merci pour les bonnes réponses! Le moyen le plus rapide d'obtenir quelques fichiers uniques vers Colab à partir de Google Drive: chargez l'assistant Drive et montez

from google.colab import drive

Cela demandera une autorisation.

drive.mount('/content/drive')

Ouvrez le lien dans un nouvel onglet-> vous obtiendrez un code - copiez-le dans l'invite, vous avez maintenant accès à la vérification de Google Drive:

!ls "/content/drive/My Drive"

puis copiez le (s) fichier (s) selon les besoins:

!cp "/content/drive/My Drive/xy.py" "xy.py"

confirmez que les fichiers ont été copiés:

!ls

est-il possible de monter uniquement un répertoire spécifique de mon lecteur vers colab?
Gowtham M

J'ai peur que ce ne soit pas possible actuellement
Himanshu Poddar

16

La plupart des réponses précédentes sont un peu (très) compliquées,

from google.colab import drive
drive.mount("/content/drive", force_remount=True)

J'ai compris que c'était le moyen le plus simple et le plus rapide de monter Google Drive dans CO Lab , vous pouvez changer le mount directory locationen ce que vous voulez en changeant simplement le paramètre pour drive.mount. Il vous donnera un lien pour accepter les autorisations avec votre compte, puis vous devrez copier-coller la clé générée, puis le lecteur sera monté dans le chemin sélectionné.

force_remount est utilisé uniquement lorsque vous devez monter le variateur indépendamment du fait qu'il soit chargé précédemment.Vous pouvez négliger ce paramètre lorsque vous ne voulez pas forcer le montage

Modifier: vérifiez ceci pour trouver plus de façons d'effectuer les IOopérations dans colab https://colab.research.google.com/notebooks/io.ipynb


13

Vous ne pouvez pas stocker définitivement un fichier sur colab. Bien que vous puissiez importer des fichiers à partir de votre lecteur et à chaque fois que vous avez terminé avec le fichier, vous pouvez le sauvegarder.

Pour monter le lecteur Google sur votre session Colab

from google.colab import drive
drive.mount('/content/gdrive')

vous pouvez simplement écrire sur Google Drive comme vous le feriez sur un système de fichiers local. Maintenant, si vous voyez que votre lecteur Google sera chargé dans l'onglet Fichiers. Maintenant, vous pouvez accéder à n'importe quel fichier depuis votre colab, vous pouvez aussi bien en écrire qu'en lire. Les modifications seront effectuées en temps réel sur votre disque et toute personne disposant du lien d'accès à votre fichier pourra visualiser les modifications que vous avez apportées depuis votre colab.

Exemple

with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
   f.write('values')

4

Je suis paresseux et ma mémoire est mauvaise, j'ai donc décidé de créer easycolab qui est plus facile à mémoriser et à taper:

import easycolab as ec
ec.mount()

Assurez-vous de l'installer en premier: !pip install easycolab

La mount()méthode implémente essentiellement ceci:

from google.colab import drive
drive.mount(‘/content/drive’)
cd ‘/content/gdrive/My Drive/’

2

Vous pouvez simplement utiliser les extraits de code sur la gauche de l'écran. entrez la description de l'image ici

Insérez "Montage de Google Drive dans votre VM"

exécutez le code et copiez et collez le code dans l'URL

puis utilisez! ls pour vérifier les répertoires

!ls /gdrive

dans la plupart des cas, vous trouverez ce que vous voulez dans le répertoire "/ gdrive / Mon lecteur"

alors vous pouvez le réaliser comme ceci:

from google.colab import drive
drive.mount('/gdrive')
import glob

file_path = glob.glob("/gdrive/My Drive/***.txt")
for file in file_path:
    do_something(file)

2

Ce que j'ai fait est d'abord:

from google.colab import drive
drive.mount('/content/drive/')

ensuite

%cd /content/drive/My Drive/Colab Notebooks/

Après je peux par exemple lire des fichiers csv avec

df = pd.read_csv("data_example.csv")

Si vous avez des emplacements différents pour les fichiers, ajoutez simplement le chemin correct après Mon disque


1

J'ai écrit une classe qui télécharge toutes les données dans le '.' emplacement sur le serveur colab

Le tout peut être extrait d'ici https://github.com/brianmanderson/Copy-Shared-Google-to-Colab

!pip install PyDrive


from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
import os

class download_data_from_folder(object):
    def __init__(self,path):
        path_id = path[path.find('id=')+3:]
        self.file_list = self.get_files_in_location(path_id)
        self.unwrap_data(self.file_list)
    def get_files_in_location(self,folder_id):
        file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".format(folder_id)}).GetList()
        return file_list
    def unwrap_data(self,file_list,directory='.'):
        for i, file in enumerate(file_list):
            print(str((i + 1) / len(file_list) * 100) + '% done copying')
            if file['mimeType'].find('folder') != -1:
                if not os.path.exists(os.path.join(directory, file['title'])):
                    os.makedirs(os.path.join(directory, file['title']))
                print('Copying folder ' + os.path.join(directory, file['title']))
                self.unwrap_data(self.get_files_in_location(file['id']), os.path.join(directory, file['title']))
            else:
                if not os.path.exists(os.path.join(directory, file['title'])):
                    downloaded = drive.CreateFile({'id': file['id']})
                    downloaded.GetContentFile(os.path.join(directory, file['title']))
        return None
data_path = 'shared_path_location'
download_data_from_folder(data_path)

1

Pour extraire le zip Google Drive d'un notebook Google colab, par exemple:

import zipfile
from google.colab import drive

drive.mount('/content/drive/')

zip_ref = zipfile.ZipFile("/content/drive/My Drive/ML/DataSet.zip", 'r')
zip_ref.extractall("/tmp")
zip_ref.close()

0

@wenkesj

Je parle de copier le répertoire et tous ses sous-répertoires.

Pour moi, j'ai trouvé une solution, qui ressemble à ceci:

def copy_directory(source_id, local_target):
  try:
    os.makedirs(local_target)
  except: 
    pass
  file_list = drive.ListFile(
    {'q': "'{source_id}' in parents".format(source_id=source_id)}).GetList()
  for f in file_list:
    key in ['title', 'id', 'mimeType']]))
    if f["title"].startswith("."):
      continue
    fname = os.path.join(local_target, f['title'])
    if f['mimeType'] == 'application/vnd.google-apps.folder':
      copy_directory(f['id'], fname)
    else:
      f_ = drive.CreateFile({'id': f['id']})
      f_.GetContentFile(fname)

Néanmoins, j'ai l'impression que gDrive n'aime pas copier trop de fichiers.


0

Il existe de nombreuses façons de lire les fichiers dans votre bloc-notes colab (**. Ipnb), quelques-unes sont:

  1. Monter votre Google Drive dans la machine virtuelle du runtime. ici et, ici
  2. Utilisation de google.colab.files.upload (). la solution la plus simple
  3. Utilisation de l' API REST native ;
  4. Utilisation d'un wrapper autour de l'API tel que PyDrive

Les méthodes 1 et 2 ont fonctionné pour moi , je n'ai pas réussi à comprendre le repos. Si quelqu'un le pouvait, comme d'autres l'ont essayé dans le post ci-dessus, veuillez écrire une réponse élégante. Merci d'avance.!

Première méthode:

Je n'ai pas pu monter mon lecteur Google, j'ai donc installé ces bibliothèques

# Install a Drive FUSE wrapper.
# https://github.com/astrada/google-drive-ocamlfuse

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse

from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass

!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

Une fois le processus d'installation et d'autorisation terminé, commencez par monter votre lecteur.

!mkdir -p drive
!google-drive-ocamlfuse drive

Après l'installation, j'ai pu monter le lecteur google, tout ce qui se trouve dans votre lecteur google commence à partir de / content / drive

!ls /content/drive/ML/../../../../path_to_your_folder/

Maintenant, vous pouvez simplement lire le fichier du path_to_your_folderdossier dans pandas en utilisant le chemin ci-dessus.

import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)

vous supposez que vous utilisez le chemin absolu que vous avez reçu et que vous n'utilisez pas /../ ..

Deuxième méthode :

Ce qui est pratique, si votre fichier que vous souhaitez lire est présent dans le répertoire de travail courant.

Si vous avez besoin de télécharger des fichiers à partir de votre système de fichiers local, vous pouvez utiliser le code ci-dessous, sinon évitez-le.!

from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
  print('User uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))

supposons que vous ayez sous la hiérarchie des dossiers dans votre lecteur Google:

/content/drive/ML/../../../../path_to_your_folder/

Ensuite, vous avez simplement besoin du code ci-dessous pour charger dans les pandas.

import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df

0

Pour lire tous les fichiers d'un dossier:

import glob
from google.colab import drive
drive.mount('/gdrive', force_remount=True)

#!ls "/gdrive/My Drive/folder"

files = glob.glob(f"/gdrive/My Drive/folder/*.txt")
for file in files:  
  do_something(file)

0
from google.colab import drive
drive.mount('/content/drive')

Cela a parfaitement fonctionné pour moi.J'ai plus tard pu utiliser la osbibliothèque pour accéder à mes fichiers, tout comme j'y accède sur mon PC


0

Pensez simplement à télécharger le fichier avec un lien permanent et gdownpréinstallé comme ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.