Google Colab: como ler os dados do meu Google Drive?

113

O problema é simples: tenho alguns dados sobre o gDrive, por exemplo, em /projects/my_project/my_data*.

Também tenho um notebook simples no gColab.

Então, eu gostaria de fazer algo como:

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

Infelizmente, todos os exemplos (como este - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , por exemplo) sugere carregar principalmente apenas todos os dados necessários para o notebook.

Mas, se eu tiver muitos dados, pode ser bem complicado. Existe alguma oportunidade para resolver este problema?

Obrigado pela ajuda!

Scitator
fonte
9
Surpreendente! ninguém forneceu um link para este bloco de notas colab que descreve todos os métodos disponíveis a partir de abril de 2019 - colab.research.google.com/notebooks/io.ipynb
humano

Respostas:

60

Boas notícias, o PyDrive tem suporte de primeira classe no CoLab! PyDrive é um wrapper para o cliente Python do Google Drive. Aqui está um exemplo de como você faria o download de TODOS os arquivos de uma pasta, semelhante 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())

Observe que os argumentos para drive.ListFileé um dicionário que coincide com os parâmetros usados ​​pela API HTTP do Google Drive (você pode personalizar o qparâmetro para ser ajustado ao seu caso de uso).

Saiba que, em todos os casos, os arquivos / pastas são codificados por ids ( veja o 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) no Google Drive. Isso requer que você pesquise no Google Drive o ID específico correspondente à pasta na qual deseja fazer a raiz de sua pesquisa.

Por exemplo, navegue até a pasta "/projects/my_project/my_data"que está localizada em seu Google Drive.

Google Drive

Veja que contém alguns arquivos, dos quais queremos fazer o download para o CoLab. Para obter o id da pasta a fim de usá-lo pelo PyDrive, olhe a url e extraia o parâmetro id. Nesse caso, o url correspondente à pasta era:

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

Onde o id é a última parte do url: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .

wenkesj
fonte
1
Obrigado! Realmente funciona! E você conhece alguma solução para copiar todo o diretório gDrive?
Scitator
@Scitator, você quer dizer todos os arquivos do Google Drive?
wenkesj
@Scitator, por favor dê uma olhada em pythonhosted.org/PyDrive/… para sua pergunta
wenkesj
1
Obrigado pela resposta. Funciona, mas de alguma forma não entendo algo. A maneira como está funcionando agora (tanto quanto eu entendo) é que ele armazena os dados no caminho fornecido em "local_download_path" no Google Drive! Mas os dados já estão no Google Drive (codificados por um id de pasta específico). Por que precisamos fazer isso? Quero dizer, os arquivos já estão no Google Drive !! Tentei esse método para ler uma pasta que contém muitas imagens e meu computador travou! Quando eu executei este código, ele realmente tentou copiar novamente todas as imagens (que já estão no Google Drive) para o "local_download_path" ??
TwinPenguins
1
Bem, acabei usando a segunda resposta (veja abaixo). É super simples e fácil. Diga-me se você ainda tiver problemas ao usar as respostas abaixo.
TwinPenguins
252

Edit : a partir de fevereiro de 2020, há agora uma IU de primeira classe para montar o Drive automaticamente.

Primeiro, abra o navegador de arquivos do lado esquerdo. Ele mostrará um botão 'Mount Drive'. Depois de clicado, você verá um prompt de permissão para montar o Drive e, em seguida, seus arquivos do Drive estarão presentes sem configuração quando você retornar ao notebook. O fluxo concluído é assim:

Exemplo de montagem automática de unidade

A resposta original segue, abaixo. (Isso também funcionará para blocos de anotações compartilhados.)

Você pode montar seus arquivos do Google Drive executando o seguinte snippet de código:

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

Em seguida, você pode interagir com seus arquivos do Drive no painel lateral do navegador de arquivos ou usando utilitários de linha de comando.

Aqui está um exemplo de caderno

Bob Smith
fonte
36
é a solução mais direta para montar seu gdrive no Google Colab, acho que deveria ser a resposta aceita
buncis
Resposta canônica, legal. O bloco de notas de exemplo é somente leitura e não pode ser usado diretamente. Executar Arquivo-> Salvar salvará um arquivo no drive.
BSalita
Como você sobe outro nível? por exemplo. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail
Você precisa se autenticar sempre que conectar seu Google Drive?
Frank Meulenaar
@FrankMeulenaar yes
DB
31

Obrigado pelas ótimas respostas! A maneira mais rápida de obter alguns arquivos únicos para o Colab do Google Drive: carregue o assistente do Drive e monte

from google.colab import drive

Isso solicitará autorização.

drive.mount('/content/drive')

Abra o link em uma nova guia-> você receberá um código - copie-o de volta para o prompt agora você tem acesso ao google drive check:

!ls "/content/drive/My Drive"

em seguida, copie os arquivos conforme necessário:

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

confirme se os arquivos foram copiados:

!ls
H-San
fonte
é possível montar apenas um diretório específico na minha unidade para colab?
Gowtham M
Receio que atualmente não seja possível
Himanshu Poddar
16

A maioria das respostas anteriores é um pouco (muito) complicada,

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

Eu descobri que essa é a maneira mais fácil e rápida de montar o Google Drive no CO Lab . Você pode alterar o mount directory locationpara o que quiser apenas alterando o parâmetro para drive.mount. Ele lhe dará um link para aceitar as permissões com sua conta e, em seguida, você deve copiar e colar a chave gerada e, em seguida, o drive será montado no caminho selecionado.

force_remount é usado apenas quando você tem que montar a unidade independentemente de ela estar carregada anteriormente. Você pode ignorar este parâmetro when se não quiser forçar a montagem

Edit: Verifique isto para encontrar mais maneiras de fazer as IOoperações em colab https://colab.research.google.com/notebooks/io.ipynb

Sundeep Pidugu
fonte
13

Você não pode armazenar um arquivo permanentemente no colab. Embora você possa importar arquivos de sua unidade e sempre que terminar com o arquivo, você pode salvá-lo de volta.

Para montar o Google Drive em sua sessão Colab

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

você pode simplesmente escrever no Google Drive como faria em um sistema de arquivos local. Agora, se você ver que o seu Google Drive será carregado na guia Arquivos. Agora você pode acessar qualquer arquivo de seu colab, você pode escrever, bem como ler a partir dele. As alterações serão feitas em tempo real na sua unidade e qualquer pessoa que tenha o link de acesso ao seu arquivo pode visualizar as alterações feitas por você a partir do seu colab.

Exemplo

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

Sou preguiçoso e minha memória é ruim, então decidi criar um easycolab que é mais fácil de memorizar e digitar:

import easycolab as ec
ec.mount()

Certifique-se de instalá-lo primeiro: !pip install easycolab

O mount()método basicamente implementa isso:

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

Você pode simplesmente usar os trechos de código à esquerda da tela. insira a descrição da imagem aqui

Insira "Montagem do Google Drive em sua VM"

execute o código e copie e cole o código no URL

e então use! ls para verificar os diretórios

!ls /gdrive

na maioria dos casos, você encontrará o que deseja no diretório "/ gdrive / Minha unidade"

então você pode fazer assim:

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
fonte
2

O que fiz primeiro:

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

Então

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

Depois, posso, por exemplo, ler arquivos csv com

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

Se você tiver locais diferentes para os arquivos, basta adicionar o caminho correto após Meu disco

eemilk
fonte
1

Eu escrevi uma classe que baixa todos os dados para o '.' localização no servidor colab

Tudo pode ser extraído daqui 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
fonte
1

Para extrair o zip do Google Drive de um notebook Google Colab, por exemplo:

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
fonte
0

@wenkesj

Estou falando sobre copiar o diretório e todos os subdiretórios.

Para mim, encontrei uma solução que se parece com esta:

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)

No entanto, parece que o gDrive não gosta de copiar muitos arquivos.

Scitator
fonte
0

Existem muitas maneiras de ler os arquivos em seu bloco de notas colab (**. Ipnb), algumas são:

  1. Montando seu Google Drive na máquina virtual do runtime. aqui e aqui
  2. Usando google.colab.files.upload (). a solução mais fácil
  3. Usando a API REST nativa ;
  4. Usando um wrapper em torno da API, como PyDrive

Os métodos 1 e 2 funcionaram para mim , o resto eu não fui capaz de descobrir. Se alguém pudesse, como outros tentaram no post acima, escreva uma resposta elegante. desde já, obrigado.!

Primeiro método:

Não consegui montar meu Google Drive, então instalei essas 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}

Assim que o processo de instalação e autorização for concluído, você primeiro monta sua unidade.

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

Após a instalação, consegui montar o google drive, tudo no seu google drive começa em / content / drive

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

Agora você pode simplesmente ler o arquivo da path_to_your_folderpasta para o pandas usando o caminho acima.

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

você deve usar o caminho absoluto recebido e não usar /../ ..

Segundo método :

O que é conveniente se o arquivo que você deseja ler estiver presente no diretório de trabalho atual.

Se você precisar fazer upload de qualquer arquivo de seu sistema de arquivos local, pode usar o código abaixo, caso contrário, apenas evite.

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

suponha que você tenha abaixo da hierarquia de pastas em seu Google Drive:

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

Então, você simplesmente precisa do código abaixo para carregar no pandas.

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

Para ler todos os arquivos em uma pasta:

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

Funcionou perfeitamente para mim. Mais tarde, pude usar a osbiblioteca para acessar meus arquivos da mesma forma que eu os acesso no meu PC

Jitin
fonte
0

Considere apenas baixar o arquivo com link permanente e gdownpré - instalado como aqui

A.Ametov
fonte