Drive APIを使ってGoogleドライブ上のファイルを更新してみる

Drive API + Python で Google ドライブ上のファイルを更新します。なにも気にせずにアップロードすると追加になってしまうので、ひと手間かけて同名の既存ファイルを上書きするようにします。

API の有効化

まずはこの辺の情報を参考に Drive API を有効化します。

Enable the Google Drive API

設定したらクライアントIDとクライアントシークレットを含む json ファイルをダウンロードして、credentials.json という名前にします。

パッケージのインストール

次にPython 用に pip で google-api-python-client と PyDrive をインストールします。

pip install google-api-python-client PyDrive

Python プログラムの作成

Python 用のプログラムを書きます。ここでは Python 3.x 系を前提に説明します。
まずは必要なパッケージを import します。

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

API に関するオブジェクトを生成します。

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

今回は更新をしたいので、まずは Google ドライブ上の既存ファイルを取得します。

drive.ListFile({'q':"title = '{}' and '{}' in parents and trashed=false".format(file_name, folder_id)})

変数 file_name は更新するファイル名、 folder_id は Google ドライブ上のフォルダーのIDで、Webブラウザーでアクセスした際の URL の末尾の文字列です。

ListFile はイテレーターが返ってくるので、

files = list(drive.ListFile({'q':"title = '{}' and '{}' in parents and trashed=false".format(file_name, folder_id)}))
if len(files) > 0:
    file = files[0]

などとするといいかもしれません。

もしファイルが見つからなければ新規作成します。

if len(files) == 0:
  file = drive.CreateFile({'title': file_name, 'mimeType': 'application/octet-stream', 'parents': [{'kind': 'drive#fileLink', 'id': folder_id}]})

mimeType は可能なら適切なものを指定してあげたほうが良いでしょう。ここでは便宜的に application/octet-stream を指定しています。

最後にアップロードを行います。

file.SetContentFile(file_path)
file.Upload()

file_path はローカルファイルのパスです。SetContentFile でアップロードするファイルを指定して Upload で実際にアップロードする感じです。

実行

ここまで作成した Python のプログラムと最初に取得した credentials.json を同じディレクトリーに置いて、いざ実行。

初回のみ Google の認証 URL が表示されるので、Webブラウザーで認証した後にキーを入力します。次回からはその認証情報が使われるので再度認証する必要はありません。