web-dev-qa-db-ja.com

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

問題は簡単です。たとえば、/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 )は、主にロードすることのみを提案していますノートに必要なすべてのデータ。

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

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

51
Scitator

良いニュース、 PyDrive はCoLabでファーストクラスをサポートしています! PyDriveは、Googleドライブpythonクライアントのラッパーです。 glob + *を使用するのと同様に、フォルダーからALLファイルをダウンロードする方法の例を次に示します。

!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ドライブで検索する必要があります。

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

Google Drive

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

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

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

38
wenkesj

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

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

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

ノートブックの例

123
Bob Smith

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

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
13
H-San

これまでの回答のほとんどは少し(非常に)複雑で、

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

Googleドライブを CO Lab にマウントする最も簡単で最速の方法であることがわかりました。mount directory locationのパラメーターを変更するだけで、drive.mountを必要なものに変更できます。アカウントの権限を受け入れるリンクが表示されます。生成されたキーをコピーして貼り付けると、選択したパスにドライブがマウントされます。

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

編集:コラボでIO操作を行う他の方法を見つけるには、こちらをご覧ください https://colab.research.google.com/notebooks/io.ipynb

9
Sundeep Pidugu

Colabにファイルを永続的に保存することはできません。ドライブからファイルをインポートできますが、ファイルの処理が完了するたびにファイルを保存できます。

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

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

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

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

私は怠け者で、記憶力が悪いので、 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/’
4

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

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

コードを実行し、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)
1
VGA Lee

@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
Scitator

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

  1. ランタイムの仮想マシンにGoogleドライブをマウントします。 here &、 here
  2. Google.colab.files.upload()を使用します。 最も簡単な解決策
  3. ネイティブREST AP​​I ;の使用
  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フォルダーからpandasにファイルを簡単に読み込むことができます。

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
anu

すべてのデータを「。」にダウンロードするクラスを作成しました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)
0