Google Colab: come leggere i dati dal mio drive google?


113

Il problema è semplice: ho alcuni dati su gDrive, ad esempio su /projects/my_project/my_data*.

Inoltre ho un semplice taccuino in gColab.

Quindi, vorrei fare qualcosa come:

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

Sfortunatamente, tutti gli esempi (come questo - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , ad esempio) suggeriscono di caricare principalmente tutti i dati necessari sul notebook.

Tuttavia, se ho molti dati, può essere piuttosto complicato. C'è qualche opportunità per risolvere questo problema?

Grazie per l'aiuto!


9
Sorprendente! nessuno ha fornito un collegamento a questo taccuino colab che descrive tutti i metodi disponibili a partire da aprile 2019 - colab.research.google.com/notebooks/io.ipynb
umano

Risposte:


60

Buone notizie, PyDrive ha un supporto di prima classe su CoLab! PyDrive è un wrapper per il client python di Google Drive. Ecco un esempio di come scaricheresti TUTTI i file da una cartella, simile all'utilizzo di 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())

Nota che l'argomento di drive.ListFileè un dizionario che coincide con i parametri utilizzati dall'API HTTP di Google Drive (puoi personalizzare il qparametro per adattarlo al tuo caso d'uso).

Sappi che in tutti i casi, i file / cartelle sono codificati dagli ID (dai un'occhiata a 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) su Google Drive. Ciò richiede che tu cerchi su Google Drive l'ID specifico corrispondente alla cartella in cui desideri eseguire il root della ricerca.

Ad esempio, vai alla cartella "/projects/my_project/my_data"che si trova nel tuo Google Drive.

Google Drive

Guarda che contiene alcuni file, in cui vogliamo scaricare in CoLab. Per ottenere l'id della cartella per poterla utilizzare da PyDrive, guarda l'URL ed estrai il parametro id. In questo caso, l'URL corrispondente alla cartella era:

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

Dove l'id è l'ultimo pezzo dell'url: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Grazie! Funziona veramente! E conosci qualche soluzione per copiare l'intera directory gDrive?
Scitator

@Scitator intendi tutti i file all'interno di Google Drive?
wenkesj

@Scitator per favore dai un'occhiata a pythonhosted.org/PyDrive/… per la tua domanda
wenkesj

1
Grazie per la risposta. Funziona, ma in qualche modo non capisco qualcosa. Il modo in cui funziona ora (per quanto ho capito) è che memorizza i dati nel percorso specificato in "local_download_path" su Google Drive! Ma i dati sono già in Google Drive (codificati da un ID cartella specifico). Perché dobbiamo farlo? Voglio dire che il file / i file sono già all'interno di Google Drive !! Ho provato questo metodo per leggere una cartella contenente molte immagini e il mio computer si è bloccato! Quando ho eseguito questo codice, ho effettivamente provato a copiare ANCORA tutte le immagini (che sono già in Google Drive) in "local_download_path" ??
TwinPenguins

1
Bene, ho finito per usare la seconda risposta (vedi sotto). È semplicissimo e facile. Dimmi se hai ancora problemi a utilizzare le risposte seguenti.
TwinPenguins

252

Modifica : a partire da febbraio 2020, ora è disponibile un'interfaccia utente di prima classe per il montaggio automatico di Drive.

Innanzitutto, apri il browser di file sul lato sinistro. Mostrerà un pulsante "Monta unità". Una volta cliccato, vedrai una richiesta di autorizzazione per montare Drive, dopodiché i tuoi file di Drive saranno presenti senza configurazione quando torni al notebook. Il flusso completato si presenta così:

Esempio di montaggio automatico dell'unità

La risposta originale segue, di seguito. (Funzionerà anche per i taccuini condivisi.)

Puoi montare i tuoi file di Google Drive eseguendo il seguente snippet di codice:

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

Quindi, puoi interagire con i tuoi file di Drive nel pannello laterale del browser dei file o utilizzando le utilità della riga di comando.

Ecco un esempio di taccuino


36
è la soluzione più semplice per montare il tuo gdrive su google colab, penso che dovrebbe essere la risposta accettata
buncis

Risposta canonica, gentile. Il notebook di esempio è di sola lettura e non può essere utilizzato direttamente. Facendo File-> Salva salverai un file su drive.
BSalita

Come sali di un altro livello? per es. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

Devi autenticarti ogni volta che colleghi il tuo Google Drive?
Frank Meulenaar

@FrankMeulenaar sì
DB

31

Grazie per le ottime risposte! Il modo più veloce per ottenere alcuni file una tantum su Colab da Google Drive: carica l'helper di Drive e monta

from google.colab import drive

Ciò richiederà l'autorizzazione.

drive.mount('/content/drive')

Apri il link in una nuova scheda-> otterrai un codice - copialo nuovamente nel prompt che ora hai accesso al controllo di Google Drive:

!ls "/content/drive/My Drive"

quindi copia i file secondo necessità:

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

confermare che i file sono stati copiati:

!ls

è possibile montare solo una directory specifica nel mio disco su colab?
Gowtham M

Temo che al momento non sia possibile
Himanshu Poddar

16

La maggior parte delle risposte precedenti sono un po '(molto) complicate,

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

Ho capito che questo è il modo più semplice e veloce per montare Google Drive in CO Lab , puoi cambiare mount directory locationin qualsiasi cosa tu voglia semplicemente cambiando il parametro perdrive.mount . Ti darà un link per accettare i permessi con il tuo account e poi dovrai copiare e incollare la chiave generata e quindi l'unità verrà montata nel percorso selezionato.

force_remount viene utilizzato solo quando si deve montare il drive indipendentemente dal fatto che sia stato caricato in precedenza. Si può trascurare questo parametro quando non si vuole forzare il montaggio

Modifica: controlla questo per trovare altri modi per eseguire le IOoperazioni in colab https://colab.research.google.com/notebooks/io.ipynb


13

Non puoi memorizzare in modo permanente un file su colab. Sebbene tu possa importare file dal tuo disco e ogni volta che hai finito con il file puoi salvarlo di nuovo.

Per montare l'unità Google nella tua sessione Colab

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

puoi semplicemente scrivere su Google Drive come faresti su un file system locale Ora se vedi che il tuo Google Drive verrà caricato nella scheda File. Ora puoi accedere a qualsiasi file dal tuo colab, puoi scrivere e leggere da esso. Le modifiche verranno eseguite in tempo reale sul tuo disco e chiunque abbia il link di accesso al tuo file può visualizzare le modifiche da te apportate dal tuo colab.

Esempio

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

4

Sono pigro e la mia memoria è pessima, quindi ho deciso di creare easycolab che è più facile da memorizzare e digitare:

import easycolab as ec
ec.mount()

Assicurati di installarlo prima: !pip install easycolab

Il mount()metodo fondamentalmente implementa questo:

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

2

Puoi semplicemente utilizzare gli snippet di codice sulla sinistra dello schermo. inserisci qui la descrizione dell'immagine

Inserisci "Montaggio di Google Drive nella tua VM"

esegui il codice e copia e incolla il codice nell'URL

e poi usa! ls per controllare le directory

!ls /gdrive

per la maggior parte dei casi, troverai quello che vuoi nella directory "/ gdrive / My drive"

allora puoi eseguirlo in questo modo:

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

Quello che ho fatto è prima:

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

Poi

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

Dopo posso, ad esempio, leggere i file CSV con

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

Se disponi di posizioni diverse per i file, aggiungi il percorso corretto dopo Il mio Drive


1

Ho scritto una classe che scarica tutti i dati in "." posizione nel server colab

Il tutto può essere estratto da qui 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

Ad esempio, per estrarre lo zip di Google Drive da un taccuino Google colab:

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

Sto parlando di copiare la directory e tutte le sue sottodirectory.

Per me, ho trovato una soluzione, che assomiglia a questa:

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)

Tuttavia, sembra che a gDrive non piaccia copiare troppi file.


0

Ci sono molti modi per leggere i file nel tuo taccuino colab (**. Ipnb), alcuni sono:

  1. Montare il tuo Google Drive nella macchina virtuale del runtime. qui e qui
  2. Utilizzando google.colab.files.upload (). la soluzione più semplice
  3. Utilizzando l' API REST nativa ;
  4. Utilizzo di un wrapper attorno all'API come PyDrive

I metodi 1 e 2 hanno funzionato per me , il resto non sono riuscito a immaginarlo. Se qualcuno può, come altri hanno provato nel post sopra, per favore scrivi una risposta elegante. Grazie in anticipo.!

Primo metodo:

Non sono riuscito a montare il mio Google Drive, quindi ho installato queste librerie

# 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}

Una volta terminato il processo di installazione e autorizzazione, devi prima montare l'unità.

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

Dopo l'installazione sono stato in grado di montare l'unità Google, tutto nella tua unità Google inizia da / content / drive

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

Ora puoi semplicemente leggere il file dalla path_to_your_foldercartella in Panda usando il percorso sopra.

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

supponi di utilizzare il percorso assoluto ricevuto e di non utilizzare /../ ..

Secondo metodo :

Il che è comodo, se il tuo file che vuoi leggere è presente nella directory di lavoro corrente.

Se hai bisogno di caricare file dal tuo file system locale, puoi usare il codice seguente, altrimenti evitalo.!

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])))

supponi di avere sotto la gerarchia delle cartelle nel tuo Google Drive:

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

Quindi, hai semplicemente bisogno del codice seguente per caricarlo nei panda.

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

0

Per leggere tutti i file in una cartella:

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')

Questo ha funzionato perfettamente per me, in seguito sono stato in grado di utilizzare la oslibreria per accedere ai miei file proprio come li accedo sul mio PC


0

Considera solo il download del file con un collegamento permanente e gdownpreinstallato come qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.