google colab で google driveを使う

pythonの開発環境としてgoogle colabを使うことにした。
google colabはgoogle提供の無料で使えるpythonの実行環境で、
gpuが使える、jupyter notebookのように色々メモしながら開発できるなどとても魅力的。
TPUという機械学習特化の計算リソースも設定一つで使えるようだ。

試しに色々コードを書いてしばらくすると、/conent(作業dir)においていたファイルが消えている...!!
ブラウザのセッションが切れると、pythonの変数はもちろん作業dirの中身も消えるようだ。
f:id:skattun:20190430233148p:plain

ソース実行に必要なファイルなど、消えて欲しくないものはgoogle driveに保存しておくのが良さそう。
google colabからgoogle driveを簡単にマウントすることができる。

google colab から google driveのファイル読み書き

# google colab try_google_drive.ipynb

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

# google drive内のファイル読み込み
with open("gdrive/My Drive/upload_file_1.txt", "r") as f:
  a = f.read()
 
# google drive内のファイル書き込み
with open("gdrive/My Drive/upload_file_1.txt", "a") as f:
  f.write("hoge fuga")

print(a)

作業dirの/content以下にgdriveでmountされる。

ブラウザからあらかじめgoogle driveにアップしておき、colab内で読み書きする分には普通のファイルと同じように使える。
ただし、ファイル作成、directory作成は一手間必要。

colabからgoogle driveのファイル・ディレクトリ作成(ファイルupload)

ファイルの作成は作業dirのファイルをgoogle driveにuploadすることで実行する。

!pip install -U -q PyDrive # colabでpip install実行するコマンド

# google drive 認証
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

##### colab上にlinkが表示され、認証するように促される #####
##### 認証したらauth用のコードをコピペする                  #####

# 作業dirで作ったファイルをupload
with open("upload_file_1.txt", "w") as f:
  f.write("output string 1")

file = drive.CreateFile()
file.SetContentFile("upload_file_1.txt")
file.Upload()

# directory作成
folder_name = 'DirTest'
folder_metadata = {'title' : folder_name, 'mimeType' : 'application/vnd.google-apps.folder'}
folder = drive.CreateFile(folder_metadata)
folder.Upload()

# 作成したdirectoryにファイルをupload
foldertitle = folder['title']
folderid = folder['id']
print('title: %s, id: %s' % (foldertitle, folderid))

#Upload file to folder
file = drive.CreateFile({"parents": [{"kind": "drive#fileLink", "id": folderid}]})
file.SetContentFile("upload_file_1.txt")
file.Upload()

そのうち簡単にできるようになるかな...?