前回より、オンラインストレージの「Googleドライブ」をPythonから操作する方法について紹介している。PythonからGoogleドライブにアクセスできれば、アイデア次第でいろいろ活用できるだろう。今回は、より詳しい使い方を紹介する。

前回のおさらい

前回は、GoogleドライブをPythonから利用するために、GoogleからOAuthクライアントIDを取得したり、Google Drive APIを有効にするなどして準備を整えた後で、テキストファイルをGoogleドライブ上に作成するという簡単なプログラムを紹介した。OAuthの仕組みがちょっと複雑なので、前回はOAuth認証で終わってしまった感があった。

そこで、今回は、ファイルの一覧を得る方法や、任意のフォルダにファイルをアップロードする方法など、より突っ込んだプログラムを紹介しよう。

ユーザ認証だけを行うプログラム

既に、前回の手順の通り作業して、settings.yamlを作成してあるという前提で話を進める。前回のプログラムでは、プログラムの中で認証を行って、その後、ファイルをGoogleドライブにアップしてしまう。そこで、最初に認証だけを行うプログラムを作ってみよう。

以下のプログラムを「gauth.py」という名前で保存しよう。

 # 必要なライブラリ --- (*1)
 from pydrive.auth import GoogleAuth
 from pydrive.drive import GoogleDrive

 # 認証を行う --- (*2)
 gauth = GoogleAuth()
 gauth.CommandLineAuth()
 print("ok")

そして、コマンドラインから、以下のプログラムを実行する。

 $ python gauth.py

初回実行の場合だけ、以下の図にあるような認証用のURLが表示される(※前回実行している場合は「ok」とだけ表示)。WebブラウザでそのURLにアクセスして、Googleアカウントでログインし「許可」ボタンをクリックすると、認証コードが表示される。そこで、表示された認証コードを、コマンドラインに入力すると、認証が完了する。

コマンドラインから認証を行っているところ

前回、プログラムについて、よく見ていなかったので、プログラムに注目してみよう。プログラムの(*1)の部分では、ライブラリPyDriveの機能を取り込んでいる。そして、(*2)では、GogoleAuth()で認証用のオブジェクトを作成し、CommandLineAuth()メソッドを呼びだして、コマンドライン用に認証を行っている。

画像ファイルをアップロードしてみよう

次に、画像ファイルをアップロードするプログラムを作ってみよう。以下のプログラムを「upload_image.py」という名前で保存する。そして、アップロードする画像を「test.jpg」という名前で用意して、プログラムと同じフォルダに配置する。

 from pydrive.auth import GoogleAuth
 from pydrive.drive import GoogleDrive

 # 認証を行う
 gauth = GoogleAuth()
 gauth.CommandLineAuth(GoogleAuth())

 # Google Driveのオブジェクトを得る --- (*1)
 drive = GoogleDrive(gauth)

 # 画像ファイルをアップロード --- (*2)
 f = drive.CreateFile({
     'title': 'test.jpg',
     'mimeType': 'image/jpeg'})
 f.SetContentFile('test.jpg')
 f.Upload()

 # アップロード結果を表示 --- (*3)
 print(f['title'], f['id'])

コマンドラインからプログラムを実行してみよう。

 $ python upload_image.py

画像をアップロードして、Googleドライブを開いてみると、画像がアップロードされているのを確認できる。

画像をアップロードしたところ

プログラムを確認してみよう。プログラムの(*1)の部分では、認証オブジェクトを引数に、GoogleDriveの操作用のオブジェクトを取得する。そして、(*2)の部分で、画像をアップロードするのだが、まず、CreateFile()メソッドでファイルを準備して、SetContentFile()メソッドでアップロードするファイルをファイルにセットし、Upoad()メソッドで実際にアップロードを行う。そして、ファイルをアップロードすると、ファイルのid情報などが得られる。

アップロードしたファイルの一覧を表示しよう

それから、アップロードしたファイルの一覧を取得する方法を見てみましょう。そのためには、以下のように、ListFile()メソッドを利用します。以下のプログラムを、list_files.pyという名前で保存しましょう。

 from pydrive.auth import GoogleAuth
 from pydrive.drive import GoogleDrive

 gauth = GoogleAuth()
 gauth.CommandLineAuth(GoogleAuth())

 # Google Driveのオブジェクトを得る
 drive = GoogleDrive(gauth)

 # ファイルの一覧を取得して表示
 file_list = drive.ListFile().GetList()
 for f in file_list:
     print(f['title'], f['id'])

コマンドラインからプログラムを実行してみましょう。すると、先ほどアップロードした画像ファイル名と、ファイルのidが表示されます。

 $ python list_files.py

Googleドライブでは、ファイルを管理するために、idが付与されます。上記コマンドを実行すると、以下のように、ファイル名とidが表示されます。(もちろん、ファイルのidは異なる値が表示されます。)

 test.jpg 0Bw-U6x8fLBGgSy15WVhQYXpsOE0

ちなみに、先ほどの画像をアップロードするプログラムを何度か実行すると、同名のファイルが複数作成されますが、それぞれのファイルは、idが異なっており、異なるファイルになるのを確認できるでしょう。

ファイルを削除する方法

ファイルの一覧を表示して、ファイルのidが得られたら、そのidを利用してファイルを削除することができます。以下のようなプログラムを作ります。以下のプログラムをdelete_file.pyという名前で保存しましょう。

この時、プログラム中の(*1)の★マークのある変数「file_id」を、先ほどアップロードした画像のidに書き換えてください。適当なidを指定するとエラーが出るので、実際に先ほどのプログラムで確認したファイルのidを指定します。

 from pydrive.auth import GoogleAuth
 from pydrive.drive import GoogleDrive

 # 削除するファイルのid ★ --- (*1)
 file_id = '0Bw-U6x8fLBGgSy15WVhQYXpsOE0'

 gauth = GoogleAuth()
 gauth.CommandLineAuth(GoogleAuth())
 drive = GoogleDrive(gauth)

 # idを指定してファイルを削除
 f = drive.CreateFile({'id': file_id})
 f.Delete()

プログラムをコマンドラインから実行してみよう。

 $ python delete_file.py

うまく削除できたら、list_files.pyを実行してファイルが削除されていることを確認してみてください。

ファイルを定期的な更新しよう

次に、ファイルの内容を定期的に更新するプログラムを作ってみよう。以下のプログラムは、30秒に一回、ファイルの内容を更新するサンプルだ。以下のプログラムを、update_text.pyという名前で保存する。

 from pydrive.auth import GoogleAuth
 from pydrive.drive import GoogleDrive
 from random import randint
 from time import sleep

 gauth = GoogleAuth()
 gauth.CommandLineAuth()
 drive = GoogleDrive(gauth)

 # 数字のテキストをGoogleドライブに書き込む --- (*1)
 f1 = drive.CreateFile({'title': 'dice.txt'})
 r = str(randint(1, 6))
 f1.SetContentString(r)
 f1.Upload()
 # アップロードするとidが得られる --- (*2)
 file_id = f1['id']

 # 定期的にファイルの内容を更新する --- (*3)
 while True:
     # idよりファイルを準備する --- (*4)
     f2 = drive.CreateFile({'id': file_id})
     r = str(randint(1, 6))
     f2.SetContentString(r)
     f2.Upload() # 変更をアップロード
     print("更新しました:" + r)
     sleep(30)

プログラムを実行するには、コマンドラインから以下のように実行する。また、プログラムを停止するには、[Ctrl]+[c]キーを押す。プログラムを止めるまで、ずっと30秒毎にファイルの内容を更新し続ける。

 python update_text.py

プログラムを実行したら、WebブラウザでGoogleドライブにアクセスして、dice.txtというファイルを確認してみよう。1から6までのランダムな数字が書き込まれているのを確認できると思う。そこで、30秒待って、改めてWebブラウザでdice.txtを見ると、数字が書き換わっているのを確認できる。

30秒に一回ファイルの内容が更新される

プログラムを確認してみよう。(*1)の部分では、dice.txtというファイルを作成し、アップロードする。すると、(*2)の部分にあるようにファイルのidを取得できる。(*3)では、while構文で繰り返しファイルの内容を更新するように指定している。(*4)では、ファイルのidからファイルを準備し、SetContentString()で新しいテキストを設定し、Upload()で新しいテキストをアップロードする。これによって、ファイルが更新される。

まとめ

以上、今回は、Googleドライブを操作する方法を中心にプログラムを紹介した。少し駆け足ながら、ファイルの追加、一覧の表示、削除と更新までの流れを確認した。これだけ分かっていれば、一通りの操作はマスターしたことになる。本稿を活かして、役に立つ自作ツールを作ってみよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。