Google Colab:Googleドライブからデータを読み取る方法は?


113

問題は簡単です/projects/my_project/my_data*。たとえば、gDriveにデータがあります 。

また、gColabにはシンプルなノートブックがあります。

だから、私は次のようなことをしたいと思います:

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

残念ながら、すべての例(この例-https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynbなど)では、主に必要なすべてのデータのみをノートブックにロードすることをお勧めしています。

しかし、大量のデータがある場合は、かなり複雑になる可能性があります。この問題を解決する機会はありますか?

手伝ってくれてありがとう!


9
びっくり!2019年4月の時点で利用可能なすべてのメソッドを説明しているこのコラボノートブックへのリンクは誰も提供していません -colab.research.google.com/notebooks/io.ipynb
人間

回答:


60

良いニュースは、PyDriveはコラボの最初のクラスをサポートしています!PyDriveは、Googleドライブのpythonクライアントのラッパーです。+ を使用する場合と同様に、フォルダからすべてのファイルをダウンロードする方法の例を次に示します。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())

への引数drive.ListFileは、Google Drive HTTP APIで使用されるパラメーターと一致するディクショナリーであることに注意しqてください(ユースケースに合わせてパラメーターをカスタマイズできます)。

すべての場合において、ファイル/フォルダはGoogleドライブ上のID(1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCkを覗く)によってエンコードされることを知っておいてください。そのためには、検索をルートするフォルダに対応する特定のIDをGoogleドライブで検索する必要があります。

たとえば"/projects/my_project/my_data"、Googleドライブにあるフォルダに移動します。

グーグルドライブ

CoLabにダウンロードするファイルがいくつか含まれていることを確認してください。PyDriveで使用するためにフォルダーのIDを取得するには、URLを見て、idパラメーターを抽出します。この場合、フォルダーに対応するURLは次のとおりです。

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

idはURLの最後の部分です:1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk


1
ありがとうございました!それは実際に動作します!そして、あなたはgDriveディレクトリ全体をコピーするための解決策を知っていますか?
サイテーター

@Scitatorは、Googleドライブ内のすべてのファイルを意味しますか?
wenkesj 2018年

@Scitatorご覧なってくださいpythonhosted.org/PyDrive/...をあなたの質問のために
wenkesj

1
返信いただきありがとうございます。うまくいきましたが、どういうわけか私には理解できません。(私が理解している限り)現在機能している方法は、Googleドライブの「local_download_path」の下の指定されたパスにデータを保存することです。ただし、データは既にGoogleドライブにあります(特定のフォルダーIDでエンコードされています)。なぜこれを行う必要があるのですか?つまり、ファイルは既にGoogleドライブ内にあります!! たくさんの画像を含むフォルダを読み取るためにこの方法を試しましたが、コンピュータがフリーズしました!このコードを実行すると、実際にすべての画像(すでにGoogleドライブにある)を「local_download_path」にコピーしようとしましたか?
TwinPenguins

1
さて、私は2番目の応答を使用してしまいました(以下を参照)。それは超シンプルで簡単です。以下の回答を使用しても問題が解決しない場合は、教えてください。
TwinPenguins 2018

252

編集:2020年2月の時点で、ドライブを自動的にマウントするためのファーストクラスのUIがあります。

まず、左側のファイルブラウザを開きます。「マウントドライブ」ボタンが表示されます。クリックすると、ドライブをマウントするためのアクセス許可のプロンプトが表示されます。その後、ノートブックに戻ると、ドライブファイルはセットアップなしで表示されます。完成したフローは次のようになります。

ドライブの自動マウントの例

元の答えは以下のとおりです。(これは共有ノートブックでも機能します。)

次のコードスニペットを実行すると、Googleドライブファイルをマウントできます。

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

次に、ファイルブラウザのサイドパネルで、またはコマンドラインユーティリティを使用してドライブファイルを操作できます。

これがノートブックの例です


36
それはあなたのgdriveをグーグルコラボにマウントするための最も簡単な解決策です、私はそれが受け入れられた答えであるべきだと思います
buncis

正解、いいですね。サンプルのノートブックは読み取り専用であり、直接使用することはできません。File-> Saveを実行すると、ドライブにファイルが保存されます。
BSalita

どのようにして次のレベルに上がりますか?たとえば。drive.mount( '/ content / drive / name with space')
Iqlaas Ismail

Googleドライブを接続するたびに認証する必要がありますか?
フランクMeulenaar

@FrankMeulenaarはい
DB

31

すばらしい回答をありがとう!GoogleドライブからColabにいくつかの1回限りのファイルを取得する最速の方法:ドライブヘルパーをロードしてマウント

from google.colab import drive

これにより、認証が要求されます。

drive.mount('/content/drive')

新しいタブでリンクを開きます->コードが表示されます。これをコピーしてプロンプトに戻し、Googleドライブチェックにアクセスできるようにします。

!ls "/content/drive/My Drive"

次に、必要に応じてファイルをコピーします。

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

ファイルがコピーされたことを確認します。

!ls

ドライブの特定のディレクトリのみをcolabにマウントすることはできますか?
Gowtham M


16

以前の答えのほとんどは少し(非常に)複雑です、

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

私はこれがグーグルにドライブをマウントする最も簡単かつ最速の方法であることを考え出しCOラボ、変更することができ、mount directory locationあなただけのためのパラメータを変更することにより、今までにしたいものにdrive.mount。それはあなたのアカウントで許可を受け入れるためのリンクをあなたに与えます、そしてあなたはあなたが生成されたキーをコピーして貼り付ける必要があります、そしてそれからドライブは選択されたパスにマウントされます。

force_remount 以前にロードされているかどうかに関係なく、ドライブをマウントする必要がある場合にのみ使用されます。強制的にマウントしたくない場合は、パラメーターを無視できます。

編集:IOコラボhttps://colab.research.google.com/notebooks/io.ipynbで操作を行う他の方法を見つけるには、これをチェックしてください


13

colabにファイルを永続的に保存することはできません。ドライブからファイルをインポートすることができますが、ファイルを使い終わったらいつでも保存できます。

GoogleドライブをColabセッションにマウントするには

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

ローカルファイルシステムに書き込むのと同じように、単にGoogleドライブに書き込むことができます。今度は、Googleドライブが[ファイル]タブに読み込まれます。これで、colabから任意のファイルにアクセスできるようになり、書き込みと読み取りが可能になります。変更はドライブ上でリアルタイムに行われ、ファイルへのアクセスリンクを持っている人は誰でも、コラボからあなたが行った変更を表示できます。

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

4

私は怠惰で記憶力が悪いので 、覚えやすく入力しやすいeasycolabを作成することにしました。

import easycolab as ec
ec.mount()

最初にインストールしてください: !pip install easycolab

mount()この方法は、基本的にこれを実装します:

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

2

画面の左側にあるコードスニペットを使用するだけです。 ここに画像の説明を入力してください

「GoogleドライブをVMにマウント」を挿入します

コードを実行し、URLにコードをコピーして貼り付けます

次に!lsを使用してディレクトリを確認します

!ls /gdrive

ほとんどの場合、ディレクトリ「/ gdrive / My drive」に必要なものが見つかります

その後、次のように実行できます。

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)

2

私がしたことは最初です:

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

その後

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

たとえば、csvファイルを次のように読み取れた後

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

ファイルの場所が異なる場合は、マイドライブの後に正しいパスを追加するだけです


1

すべてのデータを「。」にダウンロードするクラスを作成しました。colabサーバー内の場所

すべてはここから引っ張ることができます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

たとえば、GoogleコラボノートブックからGoogleドライブのzipを抽出するには:

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

私はディレクトリとそのすべてのサブディレクトリをコピーすることについて話しています。

私にとって、私はこのような解決策を見つけました:

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)

それでも、gDriveはあまり多くのファイルをコピーしたくないようです。


0

colabノートブック(**。ipnb)のファイルを読み取る方法はたくさんありますが、いくつかの方法があります。

  1. ランタイムの仮想マシンにGoogleドライブをマウントします。ここここ
  2. google.colab.files.upload()を使用します。最も簡単な解決策
  3. 使用してネイティブのREST APIを
  4. PyDriveなどのAPIのラッパーを使用する

方法1と2 はうまくいきましたが、残りはわかりませんでした。誰かができれば、他の人が上記の投稿で試したように、エレガントな答えを書いてください。前もって感謝します。!

最初の方法:

Googleドライブをマウントできなかったため、これらのライブラリをインストールしました

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

インストールと認証プロセスが完了したら、まずドライブをマウントします。

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

インストール後、Googleドライブをマウントできました。Googleドライブのすべてのものが/ content / driveから始まります

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

これでpath_to_your_folder、上記のパスを使用して、フォルダーからパンダにファイルを単に読み取ることができます。

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

受け取った絶対パスを使用していて、/ .. /。を使用していないとします。

2番目の方法

これは、読み取りたいファイルが現在の作業ディレクトリにある場合に便利です。

ローカルファイルシステムからファイルをアップロードする必要がある場合は、以下のコードを使用できますが、それ以外の場合は回避してください。

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ドライブのフォルダ階層の下にあるとします:

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

次に、パンダにロードするために以下のコードが必要です。

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

0

フォルダ内のすべてのファイルを読み取るには:

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

これは私にとって完璧に機能しました。後でosライブラリを使用して、PCでファイルにアクセスするのと同じようにファイルにアクセスできました。


0

このgdownように、永続的なリンクとプレインストールされたファイルをダウンロードすることを検討してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.