GoogleColaboratoryからマイドライブに出力する方法

# 訂正
確かに下記の記述でも当時はできたのですが、今やるとできなくなっている。。。
一応参考になるかもしれないので、この記事も残してはおきたいと思いますが、これは間違っている情報のようです。

以下のページが参考になります。少なくとも当記事よりは参考になります。

[ColaboratoryでのGoogle Driveへのマウントが簡単になっていたお話](https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786 "ColaboratoryでのGoogle Driveへのマウントが簡単になっていたお話")

# 準備
##googleドライブのディレクトリの仕組み(マイドライブとリンクさせる。)
### 初期状態の確認
最初の目標として、マイドライブをColabファイルとリンクさせます。

詳しくはまだ理解しきれていないですが、googleColabで参照しているカレントディレクトリは、通常のローカルで作業するときとは勝手が違うようなので、少し作業を行う必要があります。作業をしながら、GoogleDriveの仕組みに関してもみていこうと思います。

まず前提として、全てのgoogleColabのランタイムが全てリセットされている状態であるとします。

ランタイムが走っているものがある場合、作業がうまく進めることができない気がします。

もしリセットされていない場合は、メニューバーの「ランタイム」→「すべてのランタイムをリセット」で全てのColabファイルのランタイムをリセットをしましょう。

さて次に、話の見通しをよくするために、全く新規のgoogleColabファイルを作成することにします。

新規作成をすると、画面左上にサイドバーを表示する「>」のボタンがあるので、そこからサイドバーを表示しておくと何が起こっているのはわかりやすいでしょう。
![スクリーンショット 2018-09-11 3.04.22.png](https://qiita-image-store.s3.amazonaws.com/0/289786/57cb154f-9732-7f5f-f591-f8518b10c627.png)
(左上の>をクリックすると下記のようになる)

![スクリーンショット 2018-09-11 3.18.09.png](https://qiita-image-store.s3.amazonaws.com/0/289786/2755fdf8-86ac-2b36-1d85-b1cb09a52e13.png)
(デフォルトの状態では、「目次」が選択されているので、「ファイル」を選択しておく)


なにも、コードをかいていないときの状態をみておきたいので、まっさらな状態で実行をすると、サイドバーの部分がこのように変化するはずです。

![スクリーンショット 2018-09-11 3.00.34.png](https://qiita-image-store.s3.amazonaws.com/0/289786/e4f4cf37-2421-4576-0b8a-2ba9c510d9df.png)

もしこうではなく、なにか余計なものがいろいろ表示されている場合は、別のファイルでランタイムをリセットできていないものがあるかもしれないのでチェックしてみましょう。


## マイドライブとの連動

次に、普段、普通に使うに自分のマイドライブを連動させる処理を行います。

いろいろ調べてみると、マウントという言葉を使うようですが、マウントという言葉の意味がよく理解できていないので、便宜上「連動させる」という表現でいきたいと思います。

まずは以下のコードを実行します。

```
!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}
```

これは正直まだなにをやっているのか理解できていませんが、おそらく何か認証をとっているのでしょう。

とりあえず、この部分に関してはいわゆる「おまじない」ということで先へ進めます。

途中出てくるURLや認証コードについてもいくつかのサイトで紹介されていて、特に詰まることもないと思うので省略します。

次にこれを実行します。

```
!mkdir -p drive/my-drive   # これを実行すると、左側のところにdrive/my-driveができる。
```
そうすると、以下のように左側のサイドバーにdriveというフォルダができ、さらにその中にmy-driveとうフォルダがでてきます。

![スクリーンショット 2018-09-13 2.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/289786/fa6b2ecc-ebb3-1f2c-fff3-7a71c359589f.png)


連動させるための入れ物を作った状態です。

マイドライブのトップ画面を同期させるのであれば、以下のコードを実行します。

```
!google-drive-ocamlfuse drive/my-drive  # まさに、普段自分がみているマイドライブの中身がコピーされる。
```


そうすると、サイドバーのmy-driveの中にまさにいつもみているマイドライブのディレクトリが再現されたはずです。

ここの、「drive/my-drive」の部分は、サイドバーの中で存在しているディレクトリのパスである必要があります。そうしないとエラーになります。

自分の場合は、試験用にまさに作業をしているipynbファイルと、試しにつくっておいたSampleというフォルダが表示されています。

![スクリーンショット 2018-09-13 2.11.01.png](https://qiita-image-store.s3.amazonaws.com/0/289786/f04a2a83-f08f-09f3-0560-54a2ef9791c7.png)


ここまできてしまえば、あとは普段のローカル環境とほとんど同じです。

これで概ね準備は整いました。

# マイドライブの指定したフォルダへの出力

matplotlibなどで作成したグラフを、普段使用しているマイドライブに出力することができます。

今回説明のために、とりあえず適当なグラフを描画しておきます。


```
import numpy as np
import matplotlib.pyplot as plt
Range = np.arange(-10,10,0.1)
plt.plot(np.sin(Range))
```

![Sin_function.png](https://qiita-image-store.s3.amazonaws.com/0/289786/64b2f51d-7cbf-df3a-a3d4-bccb90128df2.png)

そして、保存するには以下のようにします。

```
filename = "drive//my-drive//Sin_function.png"   #Sin_functionの部分は適当にファイル名を置き換える。
plt.savefig(filename)
```

つまり、my-drive以下に絶対パスで指定します。ただ、スラッシュはシングルスラッシュではなく、ダブルスラッシュにします。

そうするといつもみているマイドライブの中に出力されます。

もう少しフォルダを細かく指定して保存したい場合には、マイドライブの中にフォルダを作成しておき、あとは同様に上記の「drive//my-drive//Sin_function.png」のmy-drive以下の絶対パスを対応するパスに書き換えれば大丈夫です。

# その他

## マウントする場所

「マイドライブとの連動」のセクションで、

```
!mkdir -p drive/my-drive 
!google-drive-ocamlfuse drive/my-drive
```
といったコードを実行しました。

このコードの箇所で、「my-drive」の部分をいろいろ変えてみることによって、さまざまなディレクトリを作成できます。

ただ、その挙動がよく理解できなかったことや、今回の記事で書いたことで当面不都合はないので、また理解ができたときに書くかもしれません。

## ファイルの入力(インポート)
上記で絶対パスを指定して画像を保存しました。

シングルスラッシュはダブルスラッシュにする必要がありました。

基本的には、左側のサイドバー基準であとはローカルで作業しているときと同じように絶対パスで操作をすればいいようです。

試してはいませんが、マイドライブの中からの入力も同様にできるはずです。


# 参考にしたページ

- [google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8 "google Colaboratoryでファイルを読み込む方法")

- [Google Colaboratoryでファイルを読み込む - uepon日々の備忘録](https://uepon.hatenadiary.com/entry/2018/03/21/180329 "Google Colaboratoryでファイルを読み込む - uepon日々の備忘録")
- [Colaboratoryを使ってみる - どん底から這い上がるまでの記録](https://www.pytry3g.com/entry/2018/03/19/184044 "Colaboratoryを使ってみる - どん底から這い上がるまでの記録")