問題は簡単です。たとえば、/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 )は、主にロードすることのみを提案していますノートに必要なすべてのデータ。
しかし、大量のデータがある場合、非常に複雑になる可能性があります。この問題を解決する機会はありますか?
手伝ってくれてありがとう!
良いニュース、 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"
フォルダーに移動します。
CoLabにダウンロードするファイルが含まれていることを確認してください。 PyDriveで使用するためにフォルダーのIDを取得するには、URLを見てidパラメーターを抽出します。この場合、フォルダーに対応するURLは次のとおりです。
IdはURLの最後の部分です:1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk。
次のコードスニペットを実行して、Googleドライブファイルをマウントできます。
from google.colab import drive
drive.mount('/content/drive')
次に、ファイルブラウザのサイドパネルで、またはコマンドラインユーティリティを使用して、ドライブファイルを操作できます。
すばらしい回答をありがとう! 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
これまでの回答のほとんどは少し(非常に)複雑で、
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
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')
私は怠け者で、記憶力が悪いので、 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/’
画面の左側にあるコードスニペットを使用するだけです。 ここに画像の説明を入力
「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)
@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はあまり多くのファイルをコピーすることを好まないようです。
Colabノートブック(**。ipnb)内のファイルを読み取る方法は多数ありますが、いくつかの方法があります。
方法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
すべてのデータを「。」にダウンロードするクラスを作成しました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)