Google Colab: jak odczytać dane z mojego dysku Google?


114

Problem jest prosty: trochę danych na gDrive mam np /projects/my_project/my_data*. Pod adresem .

Mam też prosty notatnik w gColab.

Chciałbym więc zrobić coś takiego:

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

Niestety, wszystkie przykłady (takie jak ten - na przykład https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb ) sugerują głównie ładowanie wszystkich niezbędnych danych do notebooka.

Ale jeśli mam dużo danych, może to być dość skomplikowane. Czy są jakieś możliwości rozwiązania tego problemu?

Dzięki za pomoc!


9
Zaskakujący! nikt nie podał linku do tego notatnika colab, który opisuje wszystkie metody dostępne od kwietnia 2019 - colab.research.google.com/notebooks/io.ipynb
— human

Odpowiedzi:


61

Dobra wiadomość, PyDrive ma pierwszorzędne wsparcie w CoLab! PyDrive to opakowanie dla klienta Pythona Dysku Google. Oto przykład, jak pobrać WSZYSTKIE pliki z folderu, podobnie jak przy użyciu 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())

Zwróć uwagę, że argumenty do drive.ListFileto słownik, który pokrywa się z parametrami używanymi przez interfejs API HTTP usługi Google Drive (możesz dostosować qparametr, aby był dostosowany do Twojego przypadku użycia).

Wiedz, że we wszystkich przypadkach pliki / foldery są kodowane za pomocą identyfikatorów ( zajrzyj do 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) na Dysku Google. Wymaga to przeszukania Dysku Google pod kątem określonego identyfikatora odpowiadającego folderowi, w którym chcesz zakorzenić swoje wyszukiwanie.

Na przykład przejdź do folderu "/projects/my_project/my_data"znajdującego się na Dysku Google.

dysk Google

Zobacz, że zawiera jakieś pliki, w których chcemy pobrać do CoLab. Aby uzyskać identyfikator folderu w celu użycia go przez PyDrive, spójrz na adres URL i wyodrębnij parametr id. W tym przypadku adres URL odpowiadający folderowi był następujący:

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

Gdzie identyfikator to ostatni element adresu URL: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Dziękuję Ci! To naprawdę działa! Czy znasz jakieś rozwiązania do kopiowania całego katalogu gDrive?
— Scitator

@Scitator czy masz na myśli wszystkie pliki na Dysku Google?
— wenkesj

@Scitator, spójrz na pythonhosted.org/PyDrive/ ... w przypadku twojego pytania
— wenkesj

1
Dziękuję za odpowiedź. Działa, ale jakoś czegoś nie rozumiem. Sposób, w jaki teraz działa (o ile rozumiem), polega na tym, że przechowuje dane w podanej ścieżce pod „local_download_path” na Dysku Google! Ale dane są już na Dysku Google (zakodowane przez określony identyfikator folderu). Dlaczego musimy to zrobić? Mam na myśli, że plik / pliki są już na Dysku Google !! Wypróbowałem tę metodę odczytu folderu zawierającego wiele obrazów, a mój komputer zawiesił się! Kiedy uruchomiłem ten kod, faktycznie próbował skopiować PONOWNIE wszystkie obrazy (które są już na Dysku Google) do „local_download_path”?
— TwinPenguins

1
Cóż, ostatecznie skorzystałem z drugiej odpowiedzi (patrz poniżej). To bardzo proste i łatwe. Powiedz mi, jeśli nadal masz problem z użyciem poniższych odpowiedzi.
— TwinPenguins,

267

Edycja : od lutego 2020 r. Dostępny jest pierwszorzędny interfejs użytkownika do automatycznego montowania Dysku.

Najpierw otwórz przeglądarkę plików po lewej stronie. Pokaże się przycisk „Zamontuj dysk”. Po kliknięciu zobaczysz monit o pozwolenie na zamontowanie Dysku, a następnie pliki na Dysku będą dostępne bez konfiguracji po powrocie do notebooka. Ukończony przepływ wygląda następująco:

Przykład automatycznego montażu napędu

Oryginalna odpowiedź znajduje się poniżej. (Będzie to również działać w przypadku udostępnionych notatników).

Możesz zamontować pliki z Dysku Google, uruchamiając następujący fragment kodu:

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

Następnie możesz wchodzić w interakcje z plikami na Dysku w panelu bocznym przeglądarki plików lub za pomocą narzędzi wiersza polecenia.

Oto przykładowy notatnik


39
jest to najprostsze rozwiązanie do zamontowania gdrive'a na google colab, myślę, że powinna być akceptowana odpowiedź
— buncis

Odpowiedź kanoniczna, miło. Przykładowy notatnik jest tylko do odczytu i nie można go używać bezpośrednio. Wykonanie polecenia Plik-> Zapisz zapisze plik na dysku.
— BSalita

Jak przechodzisz na kolejny poziom? np. drive.mount ('/ content / drive / name with space')
— Iqlaas Ismail

Czy musisz uwierzytelniać się za każdym razem, gdy podłączasz swój dysk Google?
— Frank Meulenaar

@FrankMeulenaar yes
— DB

33

Dzięki za świetne odpowiedzi! Najszybszy sposób na pobranie kilku jednorazowych plików do Colab z Dysku Google: Załaduj pomocnika Dysku i zamontuj

from google.colab import drive

Spowoduje to wyświetlenie monitu o autoryzację.

drive.mount('/content/drive')

Otwórz link w nowej karcie -> otrzymasz kod - skopiuj go z powrotem do monitu, w którym masz teraz dostęp do sprawdzenia dysku Google:

!ls "/content/drive/My Drive"

następnie skopiuj plik (i) w razie potrzeby:

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

potwierdź, że pliki zostały skopiowane:

!ls

czy można zamontować tylko określony katalog na moim dysku do colaba?
— Gowtham M

Obawiam się, że obecnie nie jest to możliwe
— Himanshu Poddar

16

Większość poprzednich odpowiedzi jest nieco (bardzo) skomplikowana,

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

Doszedłem do wniosku, że jest to najłatwiejszy i najszybszy sposób na zamontowanie dysku Google w CO Lab.Możesz zmienić mount directory locationto, co chcesz, po prostu zmieniając parametr dla drive.mount. Da ci link do zaakceptowania uprawnień na swoim koncie, a następnie musisz skopiować, wkleić wygenerowany klucz, a następnie dysk zostanie zamontowany w wybranej ścieżce.

force_remount jest używany tylko wtedy, gdy musisz zamontować dysk niezależnie od tego, czy był on wcześniej załadowany.Możesz pominąć ten parametr when jeśli nie chcesz wymusić montowania

Edycja: Sprawdź to, aby znaleźć więcej sposobów wykonywania IOoperacji w colab https://colab.research.google.com/notebooks/io.ipynb


13

Nie możesz trwale przechowywać pliku na colab. Chociaż możesz importować pliki z dysku i za każdym razem, gdy skończysz z plikiem, możesz go zapisać.

Aby zamontować dysk Google do sesji Colab

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

możesz po prostu pisać na dysku Google, tak jak w lokalnym systemie plików. Teraz, jeśli zobaczysz, że dysk Google zostanie załadowany na karcie Pliki. Teraz możesz uzyskać dostęp do dowolnego pliku ze swojej kolumny, możesz pisać i czytać z niego. Zmiany zostaną wprowadzone w czasie rzeczywistym na Twoim dysku i każdy, kto ma łącze dostępu do Twojego pliku, będzie mógł przeglądać wprowadzone przez Ciebie zmiany z poziomu Twojej kolumny.

Przykład

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

7

Najpierw zrobiłem:

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

Następnie

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

Po tym, jak mogę na przykład czytać pliki csv z rozszerzeniem

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

Jeśli masz różne lokalizacje plików, po prostu dodaj poprawną ścieżkę po Moim dysku


5

Jestem leniwy i mam kiepską pamięć, dlatego zdecydowałem się stworzyć easyColab, która jest łatwiejsza do zapamiętania i pisania:

import easycolab as ec
ec.mount()

Najpierw zainstaluj go: !pip install easycolab

mount()Metoda zasadzie zaimplementować to:

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

2

Możesz po prostu skorzystać z fragmentów kodu po lewej stronie ekranu. wprowadź opis obrazu tutaj

Wstaw „Montowanie Dysku Google w maszynie wirtualnej”

uruchom kod i skopiuj i wklej kod w adresie URL

a następnie użyj! ls do sprawdzenia katalogów

!ls /gdrive

w większości przypadków znajdziesz to, co chcesz, w katalogu „/ gdrive / My drive”

możesz to zrobić w ten sposób:

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)

1

Napisałem klasę, która pobiera wszystkie dane do „.” lokalizacja na serwerze colab

Całość można pobrać stąd 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

Aby na przykład wyodrębnić plik ZIP z Dysku Google z notatnika 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()

1

Aby odczytać wszystkie pliki w folderze:

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

@wenkesj

Mowa o skopiowaniu katalogu i wszystkich jego podkatalogów.

U mnie znalazłem rozwiązanie, które wygląda tak:

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)

Niemniej jednak wygląda na to, że gDrive nie lubi kopiować zbyt wielu plików.


0

Istnieje wiele sposobów odczytywania plików w notatniku colab (**. Ipnb), kilka z nich to:

  1. Montowanie Dysku Google na maszynie wirtualnej środowiska wykonawczego. tutaj i tutaj
  2. Korzystanie z google.colab.files.upload (). najłatwiejsze rozwiązanie
  3. Korzystanie z natywnego interfejsu API REST ;
  4. Używanie otoki wokół API, takiej jak PyDrive

Metoda 1 i 2 zadziałała dla mnie , reszty nie byłem w stanie rozgryźć. Jeśli ktokolwiek mógł, jak inni próbowali w powyższym poście, napisz elegancką odpowiedź. z góry dziękuję.!

Pierwsza metoda:

Nie udało mi się zamontować dysku Google, więc zainstalowałem te biblioteki

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

Po zakończeniu procesu instalacji i autoryzacji najpierw montujesz dysk.

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

Po instalacji udało mi się zamontować dysk Google, wszystko na twoim dysku Google zaczyna się od / content / drive

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

Teraz możesz po prostu wczytać plik z path_to_your_folderfolderu do pandy, korzystając z powyższej ścieżki.

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

przypuszczasz, że używasz otrzymanej ścieżki bezwzględnej i nie używasz /../ ..

Druga metoda :

Co jest wygodne, jeśli plik, który chcesz przeczytać, znajduje się w bieżącym katalogu roboczym.

Jeśli chcesz przesłać jakiekolwiek pliki z lokalnego systemu plików, możesz użyć poniższego kodu, w przeciwnym razie po prostu tego unikaj.!

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

załóżmy, że masz poniżej hierarchii folderów na dysku Google:

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

Następnie wystarczy poniższy kod, aby załadować do pand.

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

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

To zadziałało idealnie dla mnie. Później mogłem korzystać z osbiblioteki, aby uzyskać dostęp do moich plików, tak jak mam do nich dostęp na moim komputerze


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.