Google Colab: ¿cómo leer datos de mi unidad de Google?

113

El problema es simple: tengo algunos datos en gDrive, por ejemplo en /projects/my_project/my_data*.

También tengo un cuaderno simple en gColab.

Entonces, me gustaría hacer algo como:

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

Desafortunadamente, todos los ejemplos (como este: https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , por ejemplo) sugieren que solo se carguen principalmente todos los datos necesarios en el cuaderno.

Pero, si tengo muchos datos, puede ser bastante complicado. ¿Hay alguna oportunidad para resolver este problema?

¡Gracias por la ayuda!

Scitator
fuente
9
¡Sorprendente! nadie dio un enlace a este cuaderno de Colab que describe todos los métodos disponibles a partir de abril de 2019 - colab.research.google.com/notebooks/io.ipynb
human

Respuestas:

60

Buenas noticias, PyDrive tiene soporte de primera clase en CoLab. PyDrive es un contenedor para el cliente Python de Google Drive. A continuación se muestra un ejemplo de cómo descargar TODOS los archivos de una carpeta, similar a usar 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())

Tenga en cuenta que los argumentos de drive.ListFilees un diccionario que coincide con los parámetros utilizados por la API HTTP de Google Drive (puede personalizar el qparámetro para ajustarlo a su caso de uso).

Tenga en cuenta que en todos los casos, los archivos / carpetas están codificados por identificaciones ( mire el 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) en Google Drive. Esto requiere que busque en Google Drive la identificación específica correspondiente a la carpeta en la que desea rootear su búsqueda.

Por ejemplo, navegue hasta la carpeta "/projects/my_project/my_data"que se encuentra en su Google Drive.

Google Drive

Ver que contiene algunos archivos, en los que queremos descargar a CoLab. Para obtener la identificación de la carpeta para usarla en PyDrive, mire la URL y extraiga el parámetro de identificación. En este caso, la url correspondiente a la carpeta era:

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

Donde la identificación es la última pieza de la URL: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .

wenkesj
fuente
1
¡Gracias! ¡Realmente funciona! ¿Y conoce alguna solución para copiar todo el directorio gDrive?
Scitator
@Scitator, ¿te refieres a todos los archivos de Google Drive?
wenkesj
@Scitator, por favor, eche un vistazo a pythonhosted.org/PyDrive/… para su pregunta
wenkesj
1
Gracias por la respuesta. Funciona, pero de alguna manera no entiendo algo. ¡La forma en que está funcionando ahora (hasta donde tengo entendido) es que almacena los datos en la ruta dada en "local_download_path" en Google Drive! Pero los datos ya están en Google Drive (codificados por una identificación de carpeta específica). ¿Por qué necesitamos hacer esto? ¡¡Quiero decir que el archivo / archivos ya están en Google Drive !! He probado este método para leer una carpeta que contiene muchas imágenes, ¡y mi computadora se congeló! Cuando ejecuté este código, en realidad trató de copiar OTRA VEZ todas las imágenes (que ya están en Google Drive) al "local_download_path".
TwinPenguins
1
Bueno, terminé usando la segunda respuesta (ver más abajo). Es super simple y facil. Dime si aún tienes problemas para usar las siguientes respuestas.
TwinPenguins
252

Editar : a partir de febrero de 2020, ahora hay una interfaz de usuario de primera clase para montar Drive automáticamente.

Primero, abra el explorador de archivos en el lado izquierdo. Mostrará un botón 'Montar unidad'. Una vez que haga clic, verá un mensaje de permisos para montar Drive, y luego sus archivos de Drive estarán presentes sin configuración cuando regrese a la computadora portátil. El flujo completo se ve así:

Ejemplo de montaje automático de unidad

La respuesta original sigue, a continuación. (Esto también funcionará para cuadernos compartidos).

Puede montar sus archivos de Google Drive ejecutando el siguiente fragmento de código:

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

Luego, puede interactuar con sus archivos de Drive en el panel lateral del navegador de archivos o usando las utilidades de la línea de comandos.

Aquí hay un cuaderno de ejemplo

Bob Smith
fuente
36
es la solución más sencilla para montar su gdrive en google colab, creo que debería ser la respuesta aceptada
buncis
Respuesta canónica, agradable. El cuaderno de ejemplo es de solo lectura y no se puede utilizar directamente. Hacer Archivo-> Guardar guardará un archivo en la unidad.
BSalita
¿Cómo subes otro nivel? por ej. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail
¿Tiene que autenticarse cada vez que conecta su unidad de Google?
Frank Meulenaar
@FrankMeulenaar sí
DB
31

¡Gracias por las buenas respuestas! La forma más rápida de obtener algunos archivos únicos en Colab desde Google Drive: cargue el asistente de Drive y móntelo

from google.colab import drive

Esto solicitará autorización.

drive.mount('/content/drive')

Abra el enlace en una nueva pestaña-> obtendrá un código; cópielo de nuevo en el mensaje que ahora tiene acceso a Google Drive Check:

!ls "/content/drive/My Drive"

luego copie el (los) archivo (s) según sea necesario:

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

confirmar que los archivos se copiaron:

!ls
H-San
fuente
¿Es posible montar solo un directorio específico en mi unidad para colab?
Gowtham M
Me temo que eso no es posible actualmente
Himanshu Poddar
16

La mayoría de las respuestas anteriores son un poco (muy) complicadas,

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

Descubrí que esta es la forma más fácil y rápida de montar Google Drive en CO Lab.Puede cambiar mount directory locationa lo que quiera simplemente cambiando el parámetro drive.mount. Le dará un enlace para aceptar los permisos con su cuenta y luego tendrá que copiar y pegar la clave generada y luego la unidad se montará en la ruta seleccionada.

force_remount se usa solo cuando tiene que montar la unidad independientemente de si se cargó previamente. Puede descuidar este parámetro cuando no desea forzar el montaje

Editar: consulte esto para encontrar más formas de realizar las IOoperaciones en colab https://colab.research.google.com/notebooks/io.ipynb

Pidugu de las profundidades del sol
fuente
13

No puede almacenar permanentemente un archivo en colab. Aunque puede importar archivos desde su unidad y cada vez que haya terminado con el archivo, puede volver a guardarlo.

Para montar Google Drive en su sesión de Colab

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

simplemente puede escribir en Google Drive como lo haría en un sistema de archivos local. Ahora, si ve que su Google Drive se cargará en la pestaña Archivos. Ahora puede acceder a cualquier archivo de su colab, puede escribir y leer desde él. Los cambios se realizarán en tiempo real en su unidad y cualquier persona que tenga el enlace de acceso a su archivo puede ver los cambios realizados por usted desde su colab.

Ejemplo

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

Soy vago y tengo mala memoria, así que decidí crear easycolab, que es más fácil de memorizar y escribir:

import easycolab as ec
ec.mount()

Asegúrese de instalarlo primero: !pip install easycolab

El mount()método básicamente implementa esto:

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

Simplemente puede hacer uso de los fragmentos de código a la izquierda de la pantalla. ingrese la descripción de la imagen aquí

Inserte "Montaje de Google Drive en su VM"

ejecute el código y copie y pegue el código en la URL

y luego use! ls para verificar los directorios

!ls /gdrive

en la mayoría de los casos, encontrará lo que desee en el directorio "/ gdrive / Mi unidad"

entonces puedes realizarlo así:

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)
VGA Lee
fuente
2

Lo que he hecho es primero:

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

Luego

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

Después de que pueda, por ejemplo, leer archivos csv con

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

Si tiene diferentes ubicaciones para los archivos, simplemente agregue la ruta correcta después de Mi unidad

eemilk
fuente
1

Escribí una clase que descarga todos los datos al '.' ubicación en el servidor colab

Todo se puede extraer desde aquí 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)
Brian Mark Anderson
fuente
1

Para extraer el archivo zip de Google Drive de un cuaderno de Google Colab, por ejemplo:

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()
Alon Lavian
fuente
0

@wenkesj

Estoy hablando de copiar el directorio y todos sus subdirectorios.

Para mí, encontré una solución, que se ve así:

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)

Sin embargo, parece que a gDrive no le gusta copiar demasiados archivos.

Scitator
fuente
0

Hay muchas formas de leer los archivos en su cuaderno colab (**. Ipnb), algunas son:

  1. Montaje de su Google Drive en la máquina virtual del tiempo de ejecución. aquí y aquí
  2. Usando google.colab.files.upload (). la solucion mas facil
  3. Usando la API REST nativa ;
  4. Usando un contenedor alrededor de la API como PyDrive

El método 1 y 2 funcionaron para mí , el resto no pude entender. Si alguien pudiera, como otros intentaron en la publicación anterior, escriba una respuesta elegante. gracias por adelantado.!

Primer método:

No pude montar mi unidad de Google, así que instalé estas bibliotecas

# 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 vez finalizado el proceso de instalación y autorización, primero monte su unidad.

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

Después de la instalación, pude montar la unidad de Google, todo en su unidad de Google comienza desde / content / drive

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

Ahora puede simplemente leer el archivo de la path_to_your_foldercarpeta en pandas usando la ruta anterior.

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

se supone que usa la ruta absoluta que recibió y no usa /../ ..

Segundo método :

Lo cual es conveniente, si el archivo que desea leer está presente en el directorio de trabajo actual.

Si necesita cargar algún archivo desde su sistema de archivos local, puede usar el siguiente código, de lo contrario simplemente evítelo.

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

suponga que tiene debajo de la jerarquía de carpetas en su unidad de Google:

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

Luego, simplemente necesita el siguiente código para cargar en pandas.

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

Para leer todos los archivos de una carpeta:

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)
Angelo Mendes
fuente
0
from google.colab import drive
drive.mount('/content/drive')

Esto funcionó perfecto para mí. Más tarde pude usar la osbiblioteca para acceder a mis archivos tal como los accedo en mi PC

Jitin
fuente
0

Considere simplemente descargar el archivo con un enlace permanente y gdownpreinstalado como aquí

A.Ametov
fuente