Google Colab: bagaimana cara membaca data dari Google Drive saya?

114

Masalahnya sederhana: Saya memiliki beberapa data di gDrive, misalnya di /projects/my_project/my_data*.

Saya juga memiliki notebook sederhana di gColab.

Jadi, saya ingin melakukan sesuatu seperti:

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

Sayangnya, semua contoh (seperti ini - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , misalnya) menyarankan agar hanya memuat semua data yang diperlukan ke notebook.

Tetapi, jika saya memiliki banyak data, itu bisa menjadi sangat rumit. Apakah ada peluang untuk menyelesaikan masalah ini?

Terimakasih atas bantuannya!

Scitator
sumber
9
Mengejutkan! tidak ada yang memberi tautan ke buku catatan colab ini yang menjelaskan semua metode yang tersedia mulai Apr 2019 - colab.research.google.com/notebooks/io.ipynb
manusia

Jawaban:

61

Kabar baiknya , PyDrive memiliki dukungan kelas satu di CoLab! PyDrive adalah pembungkus untuk klien python Google Drive. Berikut adalah contoh bagaimana Anda akan mengunduh SEMUA file dari folder, mirip dengan menggunakan 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())

Perhatikan bahwa argumen ke drive.ListFileadalah kamus yang sesuai dengan parameter yang digunakan oleh API HTTP Google Drive (Anda dapat menyesuaikan qparameter untuk disesuaikan dengan kasus penggunaan Anda).

Ketahuilah bahwa dalam semua kasus, file / folder dikodekan oleh id (intip 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) di Google Drive. Ini mengharuskan Anda mencari Google Drive untuk id tertentu yang sesuai dengan folder tempat Anda ingin root pencarian Anda.

Misalnya, navigasikan ke folder "/projects/my_project/my_data"yang terletak di Google Drive Anda.

google Drive

Lihat bahwa itu berisi beberapa file, yang ingin kami unduh ke CoLab. Untuk mendapatkan id dari folder untuk digunakan oleh PyDrive, lihat url dan ekstrak parameter id. Dalam kasus ini, url yang sesuai dengan folder tersebut adalah:

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

Di mana id adalah bagian terakhir dari url: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .

wenkesj
sumber
1
Terima kasih! Ini benar-benar berhasil! Dan apakah Anda tahu solusi untuk menyalin seluruh direktori gDrive?
Scitator
@Scitator maksud Anda semua file dalam Google Drive?
wenkesj
@Scitator silakan lihat pythonhosted.org/PyDrive/… untuk pertanyaan Anda
wenkesj
1
Terima kasih balasannya. Ini berhasil, tapi entah kenapa saya tidak mengerti sesuatu. Cara kerjanya sekarang (sejauh yang saya mengerti) adalah ia menyimpan data di jalur yang diberikan di bawah "local_download_path" di Google Drive! Tapi datanya sudah ada di Google Drive (dikodekan oleh id folder tertentu). Mengapa kita perlu melakukan ini? Maksud saya file / files sudah ada di dalam Google Drive !! Saya telah mencoba metode ini untuk membaca folder yang berisi banyak gambar, dan komputer saya macet! Ketika saya menjalankan kode ini, sebenarnya mencoba untuk menyalin LAGI semua gambar (yang sudah ada di Google Drive) ke "local_download_path" ??
TwinPenguins
1
Nah, saya akhirnya menggunakan balasan kedua (lihat di bawah). Ini sangat sederhana dan mudah. Beri tahu saya jika Anda masih mengalami masalah menggunakan jawaban di bawah ini.
TwinPenguins
266

Sunting : Mulai Februari 2020, sekarang ada UI kelas satu untuk memasang Drive secara otomatis.

Pertama, buka file browser di sisi kiri. Ini akan menampilkan tombol 'Mount Drive'. Setelah diklik, Anda akan melihat permintaan izin untuk memasang Drive, dan setelah itu file Drive Anda tidak akan ada penyiapan saat Anda kembali ke notebook. Alur yang selesai terlihat seperti ini:

Contoh drive auto mount

Berikut jawaban aslinya, di bawah ini. (Ini juga akan tetap berfungsi untuk buku catatan bersama.)

Anda dapat memasang file Google Drive Anda dengan menjalankan cuplikan kode berikut:

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

Kemudian, Anda dapat berinteraksi dengan file Drive Anda di panel sisi browser file atau menggunakan utilitas baris perintah.

Berikut adalah contoh notebook

Bob Smith
sumber
39
itu solusi paling mudah untuk memasang gdrive Anda ke google colab, saya pikir itu harus menjadi jawaban yang diterima
buncis
Jawaban kanonik, bagus. Notebook contoh bersifat read-only dan tidak dapat digunakan secara langsung. Melakukan File-> Save akan menyimpan file ke drive.
BSalita
Bagaimana Anda naik level? untuk mis. drive.mount ('/ konten / drive / nama dengan spasi')
Iqlaas Ismail
Apakah Anda harus mengautentikasi setiap kali menghubungkan drive Google Anda?
Frank Meulenaar
@Frankeulenaar ya
DB
32

Terima kasih atas jawaban yang bagus! Cara tercepat untuk mendapatkan beberapa file satu kali ke Colab dari Google drive: Muat pembantu Drive dan pasang

from google.colab import drive

Ini akan meminta otorisasi.

drive.mount('/content/drive')

Buka tautan di tab baru-> Anda akan mendapatkan kode - salin kembali ke prompt Anda sekarang memiliki akses ke pemeriksaan google drive:

!ls "/content/drive/My Drive"

lalu salin file sesuai kebutuhan:

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

konfirmasi bahwa file telah disalin:

!ls
H-San
sumber
apakah mungkin untuk me-mount hanya direktori tertentu di drive saya ke colab?
Gowtham M
Saya khawatir itu tidak mungkin saat ini
Himanshu Poddar
16

Sebagian besar jawaban sebelumnya agak (Sangat) rumit,

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

Saya menemukan ini menjadi cara termudah dan tercepat untuk memasang google drive ke CO Lab , Anda dapat mengubah mount directory locationke apa pun yang Anda inginkan hanya dengan mengubah parameter drive.mount. Ini akan memberi Anda tautan untuk menerima izin dengan akun Anda dan kemudian Anda harus menyalin dan menempelkan kunci yang dihasilkan dan kemudian drive akan dipasang di jalur yang dipilih.

force_remount digunakan hanya ketika Anda harus memasang drive terlepas dari apakah itu dimuat sebelumnya. Anda dapat mengabaikan ini ketika parameter jika Anda tidak ingin memaksakan pemasangan

Edit: Lihat ini untuk mengetahui lebih banyak cara melakukan IOoperasi di colab https://colab.research.google.com/notebooks/io.ipynb

Sundeep Pidugu
sumber
13

Anda tidak dapat menyimpan file secara permanen di colab. Meskipun Anda dapat mengimpor file dari drive Anda dan setiap kali Anda selesai dengan file Anda dapat menyimpannya kembali.

Untuk memasang drive google ke sesi Colab Anda

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

Anda cukup menulis ke Google Drive seperti yang Anda lakukan ke sistem file lokal. Sekarang jika Anda melihat Google Drive Anda akan dimuat di tab File. Sekarang Anda dapat mengakses file apa pun dari colab Anda, Anda dapat menulis serta membacanya. Perubahan akan dilakukan secara real time di drive Anda dan siapa pun yang memiliki tautan akses ke file Anda dapat melihat perubahan yang Anda buat dari colab Anda.

Contoh

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

Apa yang telah saya lakukan adalah yang pertama:

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

Kemudian

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

Setelah saya bisa misalnya membaca file csv dengan

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

Jika Anda memiliki lokasi yang berbeda untuk file, cukup tambahkan jalur yang benar setelah Drive Saya

susu sapi
sumber
5

Saya malas dan ingatan saya buruk, jadi saya memutuskan untuk membuat easycolab yang lebih mudah dihafal dan diketik :

import easycolab as ec
ec.mount()

Pastikan untuk menginstalnya terlebih dahulu: !pip install easycolab

The mount()Metode pada dasarnya menerapkan ini:

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

Anda cukup menggunakan cuplikan kode di sebelah kiri layar. masukkan deskripsi gambar di sini

Masukkan "Memasang Google Drive di VM Anda"

jalankan kode dan salin & tempel kode di URL

dan kemudian gunakan! ls untuk memeriksa direktori

!ls /gdrive

untuk kebanyakan kasus, Anda akan menemukan apa yang Anda inginkan di direktori "/ gdrive / My drive"

maka Anda dapat melakukannya seperti ini:

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
sumber
1

Saya menulis kelas yang mengunduh semua data ke '.' lokasi di server colab

Semuanya bisa ditarik dari sini 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
sumber
1

Untuk mengekstrak zip Google Drive dari notebook colab Google misalnya:

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
sumber
1

Untuk membaca semua file dalam folder:

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

@bayu_joo

Saya berbicara tentang menyalin direktori dan semua subdirektorinya.

Bagi saya, saya menemukan solusi, yang terlihat seperti ini:

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)

Namun demikian, saya sepertinya gDrive tidak suka menyalin terlalu banyak file.

Scitator
sumber
0

Ada banyak cara untuk membaca file di notebook colab Anda (**. Ipnb), beberapa di antaranya adalah:

  1. Memasang Google Drive Anda di mesin virtual runtime. di sini &, di sini
  2. Menggunakan google.colab.files.upload (). solusi termudah
  3. Menggunakan REST API asli ;
  4. Menggunakan pembungkus di sekitar API seperti PyDrive

Metode 1 dan 2 berhasil untuk saya , istirahat yang tidak dapat saya pahami. Jika ada yang bisa, seperti yang dicoba orang lain di posting di atas, silakan tulis jawaban yang elegan. Terima kasih sebelumnya.!

Metode pertama:

Saya tidak dapat memasang drive Google saya, jadi saya memasang pustaka ini

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

Setelah proses instalasi & otorisasi selesai, Anda pertama-tama memasang drive Anda.

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

Setelah instalasi saya bisa me-mount google drive, semua yang ada di google drive Anda mulai dari / content / drive

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

Sekarang Anda cukup membaca file dari path_to_your_folderfolder ke panda menggunakan jalur di atas.

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

Anda misalkan Anda menggunakan jalur absolut yang Anda terima & tidak menggunakan /../ ..

Metode kedua :

Yang nyaman, jika file Anda yang ingin Anda baca ada di direktori kerja saat ini.

Jika Anda perlu mengunggah file apa pun dari sistem file lokal Anda, Anda dapat menggunakan kode di bawah ini, jika tidak, hindari saja.!

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

misalkan Anda memiliki hierarki folder di bawah di drive google Anda:

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

Kemudian, Anda hanya perlu kode di bawah ini untuk memuat ke dalam panda.

import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df
Anu
sumber
0
from google.colab import drive
drive.mount('/content/drive')

Ini bekerja sempurna bagi saya, saya kemudian dapat menggunakan osperpustakaan untuk mengakses file saya seperti cara saya mengaksesnya di PC saya

Jitin
sumber
0

Pertimbangkan untuk mengunduh file dengan tautan permanen dan sudah gdowndiinstal sebelumnya seperti di sini

A. Metov
sumber