Colaboratoryで簡単便利にファイルのやり取りをする方法

2018/11/26 追記

ちょいちょいアクセスがあるので,本エントリで
紹介している方法よりも良い方法がありますよメモ.

いつから実装されたか忘れたけど,
「FUSEを用いてGoogle Driveをマウント」
が以下の様に簡単にできるようになった.

from google.colab import drive
drive.mount('/content/gdrive')
Go to this URL in a browser: 

Enter your authorization code:
··········
Mounted at /content/gdrive

これだけで,「/content/gdrive/My Drive」という形で
Google Driveがマウントされ,フルアクセスできる.
後は,Google Drive内に作業用ディレクトリでも作成して,cdすれば良い.

自分のGoogle Driveをマウントしてファイルの操作をしたい場合は上記,
1つ2つ程度,ちょっとしたファイルのやり取りの場合は,
以下の様に左サイドパネルの「ファイル」タブを使えば良い.

このエントリを書いた時には,アンケートを書いていた位なので,
ファイルのやり取りに少し不便があるというか障壁を感じたけども,
今では万人に薦められる便利なサービスになったと思う.

2018/08/25 追記

左のサイドパネルに「ファイル」タブができた.
アップロードボタンを押すと,簡単にPCからColaboratoryの
ストレージへファイルをアップロードできる様になった.

FireShot Capture 848 - 20180823.ipynb - Colaboratory_ - https___colab.research.google.com_

大量のファイルをやり取りするのには向いていないが,ちょっとした作業でいちいち
「from google.colab import files;files.upload()」をするよりは便利かなと.
(もうちょっとGoogle Driveと連携した機能が欲しい所……)

 
 

まだまだ全然情報が無いので,もっと良い方法があるかもしれないけど,
今のところ,いろいろ試していてこれが一番簡単で便利そう.
(その他の方法については,関連を参照)

参考:
From colab directly manipulate sqlite3 format data in Google drive – StackOverflow

 
 

FUSEを用いてGoogle Driveをマウントしてしまう.
Google DriveをVM内に仮想ドライブとしてマウントしてしまうので,
普通のLinuxマシンを操作するのと同じようにファイルのやり取りができる様になる.

ただ,マウントするにあたって,2回認証作業が必要になるので,
(といっても,URLをクリックして認証キーをコピペするだけだが)
毎回毎回これをやるのはちょっと面倒だけど,一旦マウントしてしまえば,
そのまま(VMのライフタイムである12時間以内は)Google Driveを
ローカルドライブの様に処理できるので覚えておくとすっごい便利だと思う.

以下,参考記事をなぞるだけだけど.

# 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

まず,必要なものをインストール.(コピペして実行するだけ)

# Generate auth tokens for Colab
from google.colab import auth
auth.authenticate_user()

1回目の認証作業.表示されるURLをクリックして,キーをコピペ.

# Generate creds for the Drive FUSE library.
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} &1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

2回目の認証作業.表示されるURLをクリックして,キーをコピペ.

# Create a directory and mount Google Drive using that directory.
!mkdir -p drive
!google-drive-ocamlfuse drive

ドライブをマウント.
以下の様に,

!ls

datalab/ drive/

Google Driveが「drive/」として認識される.

cd drive
!ls

—Google Drive内のファイル名が列挙(略)—

という感じ.

cd Colab Notebooks

/content/drive/Colab Notebooks

して「Colab Notebooks」を作業ディレクトリにしておけば,
PCとVMの出入り口として活用できて,凄く便利.

例えば,

with open('sample.txt', 'w') as f:
  f.write('sample text')

という感じでファイルを書き出した時,VM内に書き出すと保存が大変だけど,
作業ディレクトリが「Colab Notebooks」の場合,

~\Google Drive\Colab Notebooks

にファイルがあるので,取り出し自由.
VMにアップロードしたい時も,「Colab Notebooks」にファイルを入れれば良い.
ローカルのPythonと同様に処理ができるのでちょっとした処理の場合は,
認証の手間の方が利便性を上回るかも知れないけど,
頻繁にやり取りする場合はこの方法が今のところ一番便利そう.

でも,ぶっちゃけ……,標準で「Colab Notebooks」をこういう感じにしてくれれば良いのにね.

 
 
関連:
Colaboratoryについて(まとめ)

 
 
追記:
アンケート的なものが来ていたので,星4にして上記の件を要望として出してみた.
まあ,一個人のフィードバックなので反映される可能性は低いのと,
拙い英語で正直まだ日本語でフィードバック出した方が
通じたんじゃないかって後悔する位なので,あくまで気持ち程度だけど.

Colaboratoryの目的の一が「学習用」である以上,
ファイルのやり取りがバリアになってしまってはいけないと思うし,
いちいち「google.colab.files.upload/google.colab.files.download」
するんじゃなくて(極端な言い方をすればI/Oを意識する事なく),
ローカルドライブの様に利用できる事が望ましいよなと.

カテゴリー: 未分類 パーマリンク