Google Colab: Google sürücümdeki verileri nasıl okuyabilirim?


114

Sorun basit: gDrive'da bazı verilerim var, örneğin /projects/my_project/my_data*.

Ayrıca gColab'da basit bir not defterim var.

Bu yüzden şöyle bir şey yapmak istiyorum:

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

Ne yazık ki, tüm örnekler (bunun gibi - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb , örneğin) not defterine yalnızca temel olarak gerekli tüm verileri yüklemeyi önerir.

Ancak çok fazla veriye sahipsem, oldukça karmaşık olabilir. Bu sorunu çözmek için herhangi bir fırsat var mı?

Yardım için teşekkürler!


9
Şaşırtıcı! hiç kimse bu colab not defterine Nisan 2019 itibarıyla mevcut tüm yöntemleri açıklayan bir bağlantı vermedi - colab.research.google.com/notebooks/io.ipynb
insan

Yanıtlar:


61

İyi haber, PyDrive'ın CoLab üzerinde birinci sınıf desteği var! PyDrive, Google Drive python istemcisi için bir sarmalayıcıdır. İşte + kullanmaya benzer şekilde TÜM dosyaları bir klasörden nasıl indireceğinize dair bir örnek :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())

Argümanlarının Google Drive HTTP APIdrive.ListFile tarafından kullanılan parametrelerle örtüşen bir sözlük olduğuna dikkat edin ( parametreyi kullanım durumunuza göre ayarlanacak şekilde özelleştirebilirsiniz ).q

Her durumda, dosyaların / klasörlerin Google Drive'daki id'ler tarafından kodlandığını bilin ( 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk'ye bakın ). Bu, aramanızı köklendirmek istediğiniz klasöre karşılık gelen belirli kimlik için Google Drive'da arama yapmanızı gerektirir.

Örneğin, "/projects/my_project/my_data"Google Drive'ınızda bulunan klasöre gidin .

Google sürücü

CoLab'a indirmek istediğimiz bazı dosyalar içerdiğine bakın. PyDrive tarafından kullanmak üzere klasörün kimliğini almak için url'ye bakın ve id parametresini çıkarın. Bu durumda, klasöre karşılık gelen url şuydu:

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

Kimlik, url'nin son parçasıdır: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Teşekkür ederim! Gerçekten çalışıyor! Ve gDrive dizininin tamamını kopyalamak için herhangi bir çözüm biliyor musunuz?
Scitator

@Scitator, Google Drive'daki tüm dosyaları mı kastediyorsunuz?
wenkesj

@Scitator lütfen sorunuz için pythonhosted.org/PyDrive/… ' a bakın
wenkesj

1
Yanıt için teşekkürler. Çalışıyor, ama bir şekilde bir şey anlamıyorum. Şu anda çalışma şekli (anladığım kadarıyla) verileri Google Drive'da "local_download_path" altında verilen yolda depolamasıdır! Ancak veriler zaten Google Drive'dadır (belirli bir klasör kimliği ile kodlanmıştır). Bunu neden yapmamız gerekiyor? Demek istediğim, dosya / dosyalar zaten Google Drive'da bulunuyor !! Bu yöntemi çok sayıda görüntü içeren bir klasörü okumak için denedim ve bilgisayarım dondu! Bu kodu çalıştırdığımda, aslında tüm resimleri (zaten Google Drive'da bulunan) "local_download_path" ?? klasörüne TEKRAR kopyalamaya çalıştı ??
TwinPenguins

1
Sonunda ikinci yanıtı kullandım (aşağıya bakın). Çok basit ve kolaydır. Aşağıdaki cevapları kullanırken hala sorun yaşayıp yaşamadığınızı söyleyin.
TwinPenguins

265

Düzenleme : Şubat 2020 itibarıyla artık Drive'ı otomatik olarak monte etmek için birinci sınıf bir kullanıcı arayüzü var.

İlk önce sol taraftaki dosya tarayıcısını açın. Bir 'Sürücüyü Monte Et' düğmesi gösterecektir. Tıklandığında, Drive'ı eklemek için bir izin istemi görürsünüz ve ardından, not defterine döndüğünüzde Drive dosyalarınız kurulum olmadan mevcut olur. Tamamlanan akış şöyle görünür:

Sürücü otomatik takma örneği

Orijinal cevap aşağıdadır. (Bu, paylaşılan not defterlerinde de çalışacaktır.)

Aşağıdaki kod parçacığını çalıştırarak Google Drive dosyalarınızı bağlayabilirsiniz:

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

Ardından, dosya tarayıcısı yan panelinde veya komut satırı yardımcı programlarını kullanarak Drive dosyalarınızla etkileşim kurabilirsiniz.

İşte örnek bir defter


39
gdrive'ınızı google colab'a bağlamak için en basit çözüm, bence kabul edilen yanıt bu olmalı
buncis

Kanonik cevap, güzel. Örnek not defteri salt okunurdur ve doğrudan kullanılamaz. Dosya-> Kaydet yapmak bir dosyayı sürücüye kaydedecektir.
BSalita

Başka bir seviyeye nasıl çıkarsınız? örneğin. drive.mount ('/ içerik / sürücü / boşluklu isim')
Iqlaas Ismail

Google sürücünüzü her bağladığınızda kimlik doğrulaması yapmanız gerekiyor mu?
Frank Meulenaar

@FrankMeulenaar evet
DB

32

Harika cevaplar için teşekkürler! Google Drive'dan Colab'e birkaç tek seferlik dosya almanın en hızlı yolu: Drive yardımcısını yükleyin ve bağlayın

from google.colab import drive

Bu, yetkilendirme isteyecektir.

drive.mount('/content/drive')

Bağlantıyı yeni bir sekmede açın -> bir kod alacaksınız - bunu, artık google sürücü kontrolüne erişiminiz olan komut istemine geri kopyalayın:

!ls "/content/drive/My Drive"

daha sonra dosyaları gerektiği gibi kopyalayın:

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

dosyaların kopyalandığını onaylayın:

!ls

sürücümdeki yalnızca belirli bir dizini colab'a bağlamak mümkün mü?
Gowtham M

Korkarım bu şu anda mümkün değil
Himanshu Poddar

16

Önceki cevapların çoğu biraz (Çok) karmaşık,

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

Buna çok google sürücüyü bağlamak için en kolay ve en hızlı yol olarak anladım CO Lab , Değişebilirsin mount directory locationsadece için parametreyi değiştirerek ne kadar istediğimiz için drive.mount. Hesabınızla izinleri kabul etmeniz için size bir bağlantı verecektir ve daha sonra oluşturulan anahtarı kopyalayıp yapıştırmanız gerekir ve ardından sürücü seçilen yola monte edilecektir.

force_remount yalnızca sürücüyü önceden yüklenmiş olup olmadığına bakılmaksızın monte etmeniz gerektiğinde kullanılır. Montajı zorlamak istemiyorsanız parametresini ihmal edebilirsiniz.

Düzenle: IOColab https://colab.research.google.com/notebooks/io.ipynb'deki işlemleri yapmanın daha fazla yolunu bulmak için buna göz atın


13

Bir dosyayı colab'da kalıcı olarak saklayamazsınız. Sürücünüzdeki dosyaları içe aktarabilmenize rağmen ve dosya ile işiniz bittiğinde her zaman geri kaydedebilirsiniz.

Google sürücüsünü Colab oturumunuza eklemek için

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

Yerel bir dosya sistemine yaptığınız gibi basitçe google sürücüye yazabilirsiniz. Şimdi google sürücünüzün Dosyalar sekmesinde yükleneceğini görürseniz. Artık colab'ınızdaki herhangi bir dosyaya erişebilir, yazabilir ve ondan okuyabilirsiniz. Değişiklikler sürücünüzde gerçek zamanlı olarak yapılacak ve dosyanıza erişim bağlantısına sahip olan herkes, sizin tarafınızdan yapılan değişiklikleri colab'ınızdan görüntüleyebilir.

Misal

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

7

Önce yaptığım şey:

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

Sonra

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

Örneğin csv dosyalarını okuyabildiğimde

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

Dosyalar için farklı konumlarınız varsa, Drive'ımdan sonra doğru yolu eklemeniz yeterlidir.


5

Tembelim ve hafızam kötü, bu yüzden ezberlemesi ve yazması daha kolay olan easycolab'i yaratmaya karar verdim :

import easycolab as ec
ec.mount()

Önce kurduğunuzdan emin olun: !pip install easycolab

mount()Yöntem temelde bu uygulamaya:

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

2

Ekranın sol tarafındaki kod parçacıklarından kolayca yararlanabilirsiniz. görüntü açıklamasını buraya girin

"Sanal Makinenize Google Drive Ekleme" yi ekleyin

kodu çalıştırın ve kodu kopyalayıp URL'ye yapıştırın

ve sonra dizinleri kontrol etmek için! ls kullanın

!ls /gdrive

çoğu durumda, istediğinizi "/ gdrive / Sürücüm" dizininde bulacaksınız.

o zaman bunu şu şekilde yapabilirsiniz:

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

Tüm verileri '.' Klasörüne indiren bir sınıf yazdım. colab sunucusundaki konum

Her şey buradan çekilebilir 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

Örneğin, bir Google colab not defterinden Google Drive zip dosyasını çıkarmak için:

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

Bir klasördeki tüm dosyaları okumak için:

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

@kafadergisi

Dizini ve tüm alt dizinlerini kopyalamaktan bahsediyorum.

Benim için şuna benzeyen bir çözüm buldum:

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)

Yine de gDrive çok fazla dosya kopyalamaktan hoşlanmıyor gibi görünüyor.


0

Colab not defterinizdeki (**. İpnb) dosyaları okumanın birçok yolu vardır, bunlardan birkaçı:

  1. Google Drive'ınızı çalışma zamanının sanal makinesine bağlama. burada ve burada
  2. Google.colab.files.upload () kullanma. en kolay çözüm
  3. Yerel REST API'yi kullanma ;
  4. PyDrive gibi API etrafında bir sarmalayıcı kullanma

Yöntem 1 ve 2 benim için işe yaradı , geri kalanı anlayamadım. Yukarıdaki yazıda denediği gibi, herhangi biri yapabilirse, lütfen zarif bir cevap yazın. şimdiden teşekkürler.!

İlk yöntem:

Google sürücümü bağlayamadım, bu yüzden bu kitaplıkları yükledim

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

Kurulum ve yetkilendirme işlemi bittiğinde, önce sürücünüzü takarsınız.

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

Kurulumdan sonra google sürücüsünü bağlayabildim, google sürücünüzdeki her şey / content / drive'dan başlıyor

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

Artık path_to_your_folder, yukarıdaki yolu kullanarak dosyayı klasörden pandalara kolayca okuyabilirsiniz .

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

aldığınız mutlak yolu kullandığınızı ve /../ .. kullanmadığınızı varsayarsınız.

İkinci yöntem :

Bu, okumak istediğiniz dosyanız mevcut çalışma dizininde mevcutsa uygun olanıdır.

Yerel dosya sisteminizden herhangi bir dosya yüklemeniz gerekirse, aşağıdaki kodu kullanabilirsiniz, aksi takdirde kaçının.!

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

google sürücünüzde klasör hiyerarşisinin altında olduğunu varsayalım:

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

Ardından, pandalara yüklemek için aşağıdaki koda ihtiyacınız var.

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

Benim için bu işlenmiş mükemmel daha sonra kullanmak başardı ossadece benim PC'de bunlara erişmek nasıl gibi benim dosyalara erişmek için kütüphane


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.