Google Colab: Wie lese ich Daten von meinem Google Drive?


105

Das Problem ist einfach: Ich habe einige Daten zu gDrive, zum Beispiel bei /projects/my_project/my_data*.

Außerdem habe ich ein einfaches Notizbuch in gColab.

Also möchte ich etwas tun wie:

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

Leider schlagen alle Beispiele (wie dieses - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb zum Beispiel) vor, nur alle erforderlichen Daten hauptsächlich in das Notizbuch zu laden.

Wenn ich jedoch viele Daten habe, kann dies ziemlich kompliziert sein. Gibt es Möglichkeiten, dieses Problem zu lösen?

Danke für die Hilfe!


6
Überraschend! Niemand gab einen Link zu diesem Colab-Notizbuch, das alle ab April 2019 verfügbaren Methoden beschreibt - colab.research.google.com/notebooks/io.ipynb
human

Antworten:


58

Gute Nachrichten, PyDrive bietet erstklassigen Support für CoLab! PyDrive ist ein Wrapper für den Google Drive-Python-Client. Hier ist ein Beispiel, wie Sie ALLE Dateien aus einem Ordner herunterladen würden , ähnlich wie bei Verwendung von 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())

Beachten Sie, dass es sich bei den Argumenten um drive.ListFileein Wörterbuch handelt, das mit den von der HTTP-API von Google Drive verwendeten Parametern übereinstimmt (Sie können den qParameter an Ihren Anwendungsfall anpassen ).

Beachten Sie , dass Dateien / Ordner in allen Fällen von IDs (siehe 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) in Google Drive codiert werden . Dazu müssen Sie Google Drive nach der spezifischen ID durchsuchen, die dem Ordner entspricht, in dem Sie Ihre Suche rooten möchten.

Navigieren Sie beispielsweise zu dem Ordner "/projects/my_project/my_data", der sich in Ihrem Google Drive befindet.

Google Drive

Stellen Sie sicher, dass es einige Dateien enthält, die wir in CoLab herunterladen möchten. Um die ID des Ordners abzurufen und von PyDrive zu verwenden, überprüfen Sie die URL und extrahieren Sie den Parameter id. In diesem Fall lautete die dem Ordner entsprechende URL:

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

Wo die ID das letzte Stück der URL ist: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Danke dir! Es funktioniert wirklich! Und kennen Sie Lösungen zum Kopieren des gesamten gDrive-Verzeichnisses?
Scitator

@Scitator meinst du alle Dateien in Google Drive?
Wenkesj

@ Scitator bitte werfen Sie einen Blick auf pythonhosted.org/PyDrive/… für Ihre Frage
wenkesj

1
Danke für die Antwort. Es funktioniert, aber irgendwie verstehe ich etwas nicht. Die Art und Weise, wie es jetzt funktioniert (soweit ich weiß), ist, dass es die Daten unter dem angegebenen Pfad unter "local_download_path" bei Google Drive speichert! Die Daten befinden sich jedoch bereits in Google Drive (verschlüsselt durch eine bestimmte Ordner-ID). Warum müssen wir das tun? Ich meine, die Datei / Dateien befinden sich bereits in Google Drive !! Ich habe diese Methode zum Lesen eines Ordners mit vielen Bildern ausprobiert und mein Computer ist eingefroren! Als ich diesen Code ausführte, versuchte er tatsächlich, WIEDER alle Bilder (die sich bereits in Google Drive befinden) in den "local_download_path" zu kopieren?
TwinPenguins

@MajidMortazavi, haben Sie eine Lösung für Ihre Frage erhalten? Ich habe die gleichen Schwierigkeiten beim Lesen der Datei aus einem Ordner auf dem Google-Laufwerk.!, Meine Daten befinden sich im selben Verzeichnis wie die IPNB-Datei. Wo ich festsitze, habe ich die aktuellen local_download_path = os.getcwd()Gebote verwendet FileNotFoundError: [Errno 2] No such file or directory: '/content/.ipynb_checkpoints', ich weiß nicht, warum os.getcwd()ich /content/statt eines /content/drive/ML/../../../../../**.ipnbVorschlags gebe ?
Anu

246

Bearbeiten : Ab Februar 2020 gibt es jetzt eine erstklassige Benutzeroberfläche zum automatischen Mounten von Drive.

Öffnen Sie zunächst den Dateibrowser auf der linken Seite. Es wird eine Schaltfläche "Mount Drive" angezeigt. Sobald Sie darauf geklickt haben, wird eine Berechtigungsaufforderung zum Mounten von Drive angezeigt. Anschließend werden Ihre Drive-Dateien ohne Setup angezeigt, wenn Sie zum Notebook zurückkehren. Der abgeschlossene Ablauf sieht folgendermaßen aus:

Beispiel für die automatische Montage des Laufwerks

Die ursprüngliche Antwort folgt unten. (Dies funktioniert auch weiterhin für freigegebene Notizbücher.)

Sie können Ihre Google Drive-Dateien bereitstellen, indem Sie den folgenden Codeausschnitt ausführen:

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

Anschließend können Sie mit Ihren Drive-Dateien im Seitenbereich des Dateibrowsers oder mithilfe von Befehlszeilenprogrammen interagieren.

Hier ist ein Beispiel für ein Notizbuch


36
Es ist die einfachste Lösung, um Ihr Gdrive auf Google Colab zu mounten. Ich denke, es sollte die akzeptierte Antwort sein
Buncis

Kanonische Antwort, nett. Das Beispielnotizbuch ist schreibgeschützt und kann nicht direkt verwendet werden. Wenn Sie Datei-> Speichern ausführen, wird eine Datei auf dem Laufwerk gespeichert.
BSalita

Wie kommst du auf eine andere Ebene? für zB. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

Müssen Sie sich jedes Mal authentifizieren, wenn Sie Ihr Google-Laufwerk verbinden?
Frank Meulenaar

@FrankMeulenaar ja
DB

30

Danke für die tollen Antworten! Der schnellste Weg, um ein paar einmalige Dateien von Google Drive nach Colab zu bringen: Laden Sie den Drive-Helfer und mounten Sie ihn

from google.colab import drive

Dies fordert zur Autorisierung auf.

drive.mount('/content/drive')

Öffnen Sie den Link in einem neuen Tab-> Sie erhalten einen Code - kopieren Sie diesen zurück in die Eingabeaufforderung, auf die Sie jetzt Zugriff auf Google Drive Check haben:

!ls "/content/drive/My Drive"

Kopieren Sie dann die Datei (en) nach Bedarf:

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

Bestätigen Sie, dass die Dateien kopiert wurden:

!ls

Ist es möglich, nur ein bestimmtes Verzeichnis in meinem Laufwerk in colab zu mounten?
Gowtham M

Ich fürchte, das ist derzeit nicht möglich
Himanshu Poddar

16

Die meisten der vorherigen Antworten sind etwas (sehr) kompliziert,

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

Ich habe herausgefunden, dass dies der einfachste und schnellste Weg ist, um Google Drive in CO Lab zu mounten. Sie können das ändern mount directory location, was immer Sie wollen, indem Sie einfach den Parameter für ändern drive.mount. Sie erhalten einen Link, über den Sie die Berechtigungen für Ihr Konto akzeptieren können. Anschließend müssen Sie den generierten Schlüssel kopieren und einfügen. Anschließend wird das Laufwerk im ausgewählten Pfad bereitgestellt.

force_remount wird nur verwendet, wenn Sie das Laufwerk bereitstellen müssen, unabhängig davon, ob es zuvor geladen wurde. Sie können diesen when-Parameter vernachlässigen, wenn Sie die Bereitstellung nicht erzwingen möchten

Bearbeiten: Weitere IOInformationen zum Ausführen der Vorgänge finden Sie in colab https://colab.research.google.com/notebooks/io.ipynb


13

Sie können eine Datei nicht dauerhaft in colab speichern. Sie können zwar Dateien von Ihrem Laufwerk importieren und jedes Mal, wenn Sie mit der Datei fertig sind, wieder speichern.

So mounten Sie das Google-Laufwerk in Ihre Colab-Sitzung

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

Sie können einfach auf Google Drive schreiben, wie Sie es in ein lokales Dateisystem tun würden. Wenn Sie nun sehen, dass Ihr Google Drive auf der Registerkarte "Dateien" geladen wird. Jetzt können Sie von Ihrem Colab aus auf jede Datei zugreifen, sowohl schreiben als auch lesen. Die Änderungen werden in Echtzeit auf Ihrem Laufwerk vorgenommen, und jeder, der über den Zugriffslink zu Ihrer Datei verfügt, kann die von Ihnen vorgenommenen Änderungen in Ihrem Colab anzeigen.

Beispiel

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

4

Ich bin faul und mein Gedächtnis ist schlecht, deshalb habe ich beschlossen, easycolab zu erstellen, das sich leichter merken und eingeben lässt :

import easycolab as ec
ec.mount()

Stellen Sie sicher, dass Sie es zuerst installieren: !pip install easycolab

Die mount()Methode implementiert dies grundsätzlich:

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

2

Sie können einfach die Codefragmente auf der linken Seite des Bildschirms verwenden. Geben Sie hier die Bildbeschreibung ein

Fügen Sie "Google Drive in Ihre VM einbinden" ein.

Führen Sie den Code aus und kopieren Sie den Code und fügen Sie ihn in die URL ein

und überprüfen Sie dann mit! ls die Verzeichnisse

!ls /gdrive

In den meisten Fällen finden Sie das gewünschte Verzeichnis im Verzeichnis "/ gdrive / My drive".

dann können Sie es so ausführen:

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

Ich habe eine Klasse geschrieben, die alle Daten in das '.' Speicherort auf dem Colab-Server

Das Ganze kann von hier abgerufen werden 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

So extrahieren Sie die Google Drive-Zip-Datei aus einem Google Colab-Notizbuch:

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

Ich spreche über das Kopieren des Verzeichnisses und aller seiner Unterverzeichnisse.

Für mich habe ich eine Lösung gefunden, die so aussieht:

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)

Trotzdem sieht es so aus, als würde gDrive nicht gerne zu viele Dateien kopieren.


0

Es gibt viele Möglichkeiten, die Dateien in Ihrem Colab-Notizbuch (**. Ipnb) zu lesen. Einige davon sind:

  1. Mounten Ihres Google Drive in der virtuellen Maschine der Laufzeit. hier & hier
  2. Verwenden von google.colab.files.upload (). die einfachste Lösung
  3. Verwenden der nativen REST-API ;
  4. Verwenden eines Wrappers um die API wie PyDrive

Methode 1 und 2 funktionierten für mich , Ruhe konnte ich nicht herausfinden. Wenn jemand könnte, wie andere im obigen Beitrag versucht haben, schreiben Sie bitte eine elegante Antwort. Danke im Voraus.!

Erste Methode:

Ich konnte mein Google-Laufwerk nicht bereitstellen, daher habe ich diese Bibliotheken installiert

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

Sobald der Installations- und Autorisierungsprozess abgeschlossen ist, mounten Sie zuerst Ihr Laufwerk.

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

Nach der Installation konnte ich das Google-Laufwerk mounten. Alles in Ihrem Google-Laufwerk beginnt mit / content / drive

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

Jetzt können Sie die Datei einfach path_to_your_folderüber den obigen Pfad aus dem Ordner in Pandas lesen .

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

Sie nehmen an, Sie verwenden den absoluten Pfad, den Sie erhalten haben, und verwenden nicht /../ ..

Zweite Methode :

Was praktisch ist, wenn Ihre Datei, die Sie lesen möchten, im aktuellen Arbeitsverzeichnis vorhanden ist.

Wenn Sie Dateien aus Ihrem lokalen Dateisystem hochladen müssen, können Sie den folgenden Code verwenden, andernfalls vermeiden Sie ihn einfach.!

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

Angenommen, Sie haben unterhalb der Ordnerhierarchie in Ihrem Google-Laufwerk:

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

Dann brauchen Sie einfach den folgenden Code, um in Pandas zu laden.

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

0

So lesen Sie alle Dateien in einem Ordner:

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

Dies funktionierte perfekt für mich. Später konnte ich die osBibliothek verwenden, um auf meine Dateien zuzugreifen, genau wie ich auf meinem PC darauf zugegriffen habe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.