note.nkmk.me

Python, PyDriveでGoogle Driveのダウンロード、アップロード、削除など

Date: 2019-07-17 / tags: Python, PyDrive

PyDriveはgoogle-api-python-clientのラッパーライブラリ。これを利用するとPythonからGoogle Drive APIを簡単に処理できる。

ここでは、PyDriveの基本的な使い方として、Googleドライブへファイルをダウンロードしたり、Googleドライブのファイルをリネームしたりダウンロードしたり削除したりする方法について説明する。

  • PyDriveのインストール
  • PyDriveが使っているのはGoogle Drive API v2
  • Google Drive APIの利用登録
  • OAuth認証
    • settings.yamlの設定
    • Oauth認証を行うコード
    • 注意点
  • ローカルのファイルをアップロード
  • テキストファイルを新規作成
  • メタデータ(ファイル名など)の確認・変更
  • Googleドライブのファイルをダウンロード
  • Googleドライブのファイルを削除
    • ゴミ箱に入れる・ゴミ箱から戻す
    • 完全に削除

Googleドライブのフォルダの操作やファイルのリストの取得などについては以下の記事を参照。

なお、以下はPyDriveバージョン1.3.1の情報。

スポンサーリンク

PyDriveのインストール

pip(環境によってはpip3)でインストールできる。

$ pip install pydrive

PyDriveが使っているのはGoogle Drive API v2

バージョン1.3.1の時点ではPyDriveはGoogle Drive API v2を使用している。

Google Drive APIの最新バージョンはv3。ファイル名・フォルダ名を表すフィールドの名称がv2ではtitleだがv3ではnameになっていたりする。大元のAPIの使用を調べるときは注意。

Google Drive APIの利用登録

Google Drive APIを利用するために以下のような登録作業が必要。

  1. プロジェクトの作成
    • Google Developers Console
    • ダッシュボード(左側ペインから選択)で新たなプロジェクトを作成
      • プロジェクトが一つもない場合は、プロジェクト作成のダイアログが表示される
      • すでにプロジェクトがある場合は、左上(ロゴの右側)のプロジェクト選択から新規プロジェクトを作成する
  2. Google Drive APIの有効化
    • ダッシュボードAPIとサービスの有効化をクリック
    • 検索ボックスにGoogle Drive APIと入力して、選択、有効化
  3. 認証情報を作成
    • 認証情報(左側ペインから選択)で認証情報を作成
      • 認証情報を作成OAuthクライアントIDの作成
        • 表示に従って同意画面を設定
          • アプリケーション名に適当な名前を入力すればOK
        • アプリケーションの種類その他として認証情報を作成
    • 作成した認証情報のJSONファイルをダウンロード
      • 作成後、右側のダウンロードマーク(下矢印マーク)からダウンロード可能

Google Drive APIの利用登録については以下の記事でスクリーンショットとともに解説されている。画面のレイアウトが若干変わっているがほぼ同じ。

OAuth認証

PyDriveを使うとOAuth認証が簡単にできる。公式ドキュメントの該当部分は以下。

デフォルトではPythonのカレントディレクトリ(作業ディレクトリ)のclient_secrets.jsonを認証情報のファイルとして確認するようになっているが、settings.yamlというファイルを作成しておくことで柔軟な設定が可能。

settings.yamlの設定

settinngs.yamlで設定する項目は以下の通り。詳細は上記の公式ドキュメントを参照。

  • client_config_backend

    • file(デフォルト): 認証情報をファイルから読み込む
      • ファイルのパスはclient_config_fileで設定
        • client_config_fileのデフォルトはclient_secrets.json
    • settings: 認証情報をsettings.yaml内に記述
      • 認証情報はclient_configで設定
  • save_credentials

    • False(デフォルト): credentialsを保存しない
    • True: credentialsをファイルで保存する
      • save_credentials_backendfileに設定
      • save_credentials_fileに保存先を設定
    • ファイルで保存すると、2回目以降はブラウザを起動することなく認証できるので便利
  • get_refresh_token

    • False(デフォルト): refresh tokenを取得しない
    • True: : refresh tokenを取得する
  • oauth_scope

例1

認証情報をsettings.yaml内に記述する例。client_idclient_secretGoogle Developers Console認証情報から確認できる。JSONファイルから読み取ることも可能。

スコープも設定している。

client_config_backend: settings
client_config:
  client_id: <your_client_id>
  client_secret: <your_client_secret>

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True

oauth_scope:
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

例2

認証情報をファイルから読み込む例。上述のように、JSONファイルもGoogle Developers Console認証情報からダウンロードできる。ここではsettings.yamlと同じディレクトリ内のsecretsというディレクトリの中のJSONファイルを読み取るように設定している。

スコープは設定していないのでデフォルトのフルアクセスのまま。

client_config_file: secrets/client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: secrets/credentials.json

get_refresh_token: True

Oauth認証を行うコード

settinngs.yamlなどを正しく準備して以下のコードを実行するとブラウザが起動し認証画面が表示される。

例えばChromeの場合はこのアプリは確認されていませんという警告画面が出るが、下部の詳細のリンクから進むことができる。認証画面ではスコープの内容も表示される。

import os

from pydrive.auth import GoogleAuth

os.chdir(os.path.dirname(os.path.abspath(__file__)))

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
source: auth.py

ここでは、os.chdir()および__file__などを利用して、カレントディレクトリをスクリプトファイル(.pyファイル)のあるディレクトリに移動している。理由は次に説明する。

認証したアクセス権の解除はGoogleアカウントから行う。

注意点

カレントディレクトリ(作業ディレクトリ)

読み込むsettinngs.yamlの場所を指定することはできず、常にカレントディレクトリ(Pythonを起動したディレクトリ = 作業ディレクトリ)のものが読み込まれる。

上のサンプルコードのようにカレントディレクトリを.pyファイルの場所に移動するようにしてsettinngs.yamlを.py`ファイルと同じディレクトリに置いておけば、様々な場所からプログラムを実行できる。

スコープ

デフォルトではファイルの削除なども含むあらゆる操作が許可される。

思いがけず重要なファイルを削除してしまったりするようなことがないように、目的にあったスコープを設定しておくと安心。以下のようなものがある。

  • https://www.googleapis.com/auth/drive.file
    • このアプリケーションで作成・アップロードしたファイルのみ削除などが可能
    • 既存のファイルは削除できない
  • https://www.googleapis.com/auth/drive.metadata
    • メタデータ(ファイル名など)のアクセスのみ可能

そのほかのスコープの種類などの詳細は以下の公式ドキュメント参照。

スコープの内容は認証時に表示される。

以下のサンプルコードではすべてデフォルトのフルアクセスのスコープで実行している。削除したいのにできないというような場合、スコープの設定が正しくない可能性があるので要確認。

ローカルのファイルをアップロード

認証情報を元に、GoogleDrive()GoogleDriveオブジェクトを生成する。

import os
import pprint

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

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

print(type(drive))
# <class 'pydrive.drive.GoogleDrive'>

pprintは出力を見やすくするためにインポートしている。処理自体には不要。

ここまでの流れは以降も同様。

ローカルのファイルをアップロードするには、まずCreateFile()で空のGoogleDriveFileオブジェクトを生成する。

f = drive.CreateFile()
print(type(f))
# <class 'pydrive.files.GoogleDriveFile'>

print(f)
# GoogleDriveFile({})

SetContentFile()でファイルをセットする。引数には、絶対パスかカレントディレクトリからの相対パスを指定する。

'title'にファイル名が設定され、'mimeType'が自動的に判別される。

f.SetContentFile('src/lena.jpg')
print(f)
# GoogleDriveFile({'title': 'src/lena.jpg', 'mimeType': 'image/jpeg'})

上の例のように、ディレクトリを含むパス文字列を指定できるが、'title'にはその文字列のまま設定されるので注意。ファイル名のみに変換されたりはしない。

'title'を変更したい場合は、辞書のように新たな値を設定する。パス文字列からファイル名を抽出するにはos.path.basename()が利用できる。

f['title'] = os.path.basename('src/lena.jpg')
print(f)
# GoogleDriveFile({'title': 'lena.jpg', 'mimeType': 'image/jpeg'})

Upload()でアップロードする。アップロードするとメタデータが更新され、Googleドライブ上でのURLやIDなどが確認できる。

f.Upload()

pprint.pprint(f)
# {'alternateLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/view?usp=drivesdk',
#  'appDataContents': False,
#  'capabilities': {'canCopy': True, 'canEdit': True},
#  'copyRequiresWriterPermission': False,
#  'copyable': True,
#  'createdDate': '2019-07-16T13:42:18.959Z',
#  'downloadUrl': 'https://doc-14-2c-docs.googleusercontent.com/docs/securesc/dau8ajrf53dp30a065bvma64rthbbkv8/a79cnfgqkdr0hhjgseunhbajkeurcjgk/1563278400000/15529215658844670952/15529215658844670952/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS?e=download&gd=true',
#  'editable': True,
#  'embedLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/preview?usp=drivesdk',
#  'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/MTU2MzI4NDUzODk1OQ"',
#  'explicitlyTrashed': False,
#  'fileExtension': 'jpg',
#  'fileSize': '32468',
#  'headRevisionId': '0BweKIFCqYN07TDJNRXhEUll4cDJ2S3MySGJtTG1sc0pvSFkwPQ',
#  'iconLink': 'https://drive-thirdparty.googleusercontent.com/16/type/image/jpeg',
#  'id': '1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS',
#  'imageMediaMetadata': {'height': 225, 'rotation': 0, 'width': 400},
#  'kind': 'drive#file',
#  'labels': {'hidden': False,
#             'restricted': False,
#             'starred': False,
#             'trashed': False,
#             'viewed': True},
#  'lastModifyingUser': {'displayName': 'nkmk on',
#                        'emailAddress': 'nkmk.on@gmail.com',
#                        'isAuthenticatedUser': True,
#                        'kind': 'drive#user',
#                        'permissionId': '15529215658844670952'},
#  'lastModifyingUserName': 'nkmk on',
#  'lastViewedByMeDate': '2019-07-16T13:42:18.959Z',
#  'markedViewedByMeDate': '1970-01-01T00:00:00.000Z',
#  'md5Checksum': '18f790b9a2e45f9d7e37174df7714249',
#  'mimeType': 'image/jpeg',
#  'modifiedByMeDate': '2019-07-16T13:42:18.959Z',
#  'modifiedDate': '2019-07-16T13:42:18.959Z',
#  'originalFilename': 'lena.jpg',
#  'ownerNames': ['nkmk on'],
#  'owners': [{'displayName': 'nkmk on',
#              'emailAddress': 'nkmk.on@gmail.com',
#              'isAuthenticatedUser': True,
#              'kind': 'drive#user',
#              'permissionId': '15529215658844670952'}],
#  'parents': [{'id': '0AAeKIFCqYN07Uk9PVA',
#               'isRoot': True,
#               'kind': 'drive#parentReference',
#               'parentLink': 'https://www.googleapis.com/drive/v2/files/0AAeKIFCqYN07Uk9PVA',
#               'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/parents/0AAeKIFCqYN07Uk9PVA'}],
#  'quotaBytesUsed': '32468',
#  'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS',
#  'shared': False,
#  'spaces': ['drive'],
#  'thumbnailLink': 'https://lh3.googleusercontent.com/lyCvx5zSBVXNO7CIyQ3ISrb9UvqWWuTJJKUrRE9kJ-R_hdbZE-CBUdoE9V0Yz5wOlVG26i39BAU=s220',
#  'title': 'lena.jpg',
#  'userPermission': {'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/d98zwIsA2bB9SfEk4Agv9C_CkuY"',
#                     'id': 'me',
#                     'kind': 'drive#permission',
#                     'role': 'owner',
#                     'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/permissions/me',
#                     'type': 'user'},
#  'version': '2',
#  'webContentLink': 'https://drive.google.com/uc?id=1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS&export=download',
#  'writersCanShare': True}

アップロードした時点で一意のIDが付与される。同じ名前で同じファイルをアップロードしても別のIDが付与され、Googleドライブ上では別々のファイルとして扱われる。上書きされたりはしない。

テキストファイルを新規作成

SetContentFile()ではなくSetContentString()を使うと、テキストファイルをGoogleドライブ上に新規作成できる。引数に指定した文字列がテキストファイルの中身となる。

f_txt = drive.CreateFile({'title': 'new_file.txt'})
f_txt.SetContentString('new text')
print(f_txt)
# GoogleDriveFile({'title': 'new_file.txt', 'mimeType': 'text/plain'})

f_txt.Upload()

このサンプルコードのように、CreateFile()の引数に辞書を指定して、生成時にファイル名などのメタデータを設定することも可能。もちろん、アップロードの例のようにGoogleDriveFileオブジェクトを生成してから値を追加・変更してもOK。

なお、この場合に生成できるのはあくまでもテキストファイルで、Googleドキュメントではない。

メタデータ(ファイル名など)の確認・変更

既存のファイルのメタデータを確認したい場合は、'id'を設定したGoogleDriveFileオブジェクトを生成する。この時点では、ローカルでオブジェクトが作成されただけだが、FetchMetadata()を実行するとメタデータを取得できる。

file_id = drive.ListFile({'q': 'title = "lena.jpg"'}).GetList()[0]['id']

f = drive.CreateFile({'id': file_id})
print(type(f))
# <class 'pydrive.files.GoogleDriveFile'>

print(f)
# GoogleDriveFile({'id': '1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS'})

f.FetchMetadata()
pprint.pprint(f)
# {'alternateLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/view?usp=drivesdk',
#  'appDataContents': False,
#  'capabilities': {'canCopy': True, 'canEdit': True},
#  'copyRequiresWriterPermission': False,
#  'copyable': True,
#  'createdDate': '2019-07-16T13:42:18.959Z',
#  'downloadUrl': 'https://doc-14-2c-docs.googleusercontent.com/docs/securesc/dau8ajrf53dp30a065bvma64rthbbkv8/a79cnfgqkdr0hhjgseunhbajkeurcjgk/1563278400000/15529215658844670952/15529215658844670952/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS?e=download&gd=true',
#  'editable': True,
#  'embedLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/preview?usp=drivesdk',
#  'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/MTU2MzI4NTE0MzkwNA"',
#  'explicitlyTrashed': False,
#  'fileExtension': 'jpg',
#  'fileSize': '32468',
#  'headRevisionId': '0BweKIFCqYN07TDJNRXhEUll4cDJ2S3MySGJtTG1sc0pvSFkwPQ',
#  'iconLink': 'https://drive-thirdparty.googleusercontent.com/16/type/image/jpeg',
#  'id': '1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS',
#  'imageMediaMetadata': {'height': 225, 'rotation': 0, 'width': 400},
#  'kind': 'drive#file',
#  'labels': {'hidden': False,
#             'restricted': False,
#             'starred': False,
#             'trashed': False,
#             'viewed': True},
#  'lastModifyingUser': {'displayName': 'nkmk on',
#                        'emailAddress': 'nkmk.on@gmail.com',
#                        'isAuthenticatedUser': True,
#                        'kind': 'drive#user',
#                        'permissionId': '15529215658844670952'},
#  'lastModifyingUserName': 'nkmk on',
#  'lastViewedByMeDate': '2019-07-16T13:52:23.904Z',
#  'markedViewedByMeDate': '1970-01-01T00:00:00.000Z',
#  'md5Checksum': '18f790b9a2e45f9d7e37174df7714249',
#  'mimeType': 'image/jpeg',
#  'modifiedByMeDate': '2019-07-16T13:52:23.904Z',
#  'modifiedDate': '2019-07-16T13:52:23.904Z',
#  'originalFilename': 'lena.jpg',
#  'ownerNames': ['nkmk on'],
#  'owners': [{'displayName': 'nkmk on',
#              'emailAddress': 'nkmk.on@gmail.com',
#              'isAuthenticatedUser': True,
#              'kind': 'drive#user',
#              'permissionId': '15529215658844670952'}],
#  'parents': [{'id': '0AAeKIFCqYN07Uk9PVA',
#               'isRoot': True,
#               'kind': 'drive#parentReference',
#               'parentLink': 'https://www.googleapis.com/drive/v2/files/0AAeKIFCqYN07Uk9PVA',
#               'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/parents/0AAeKIFCqYN07Uk9PVA'}],
#  'quotaBytesUsed': '32468',
#  'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS',
#  'shared': False,
#  'spaces': ['drive'],
#  'thumbnailLink': 'https://lh3.googleusercontent.com/q8dgtrwulazHkBlUjw2n6H7b5ooUFlypnlz8Z6-ZD_pOvd_arSA-Jl4T-LjTzeHePac7fM6zv9M=s220',
#  'title': 'lena.jpg',
#  'userPermission': {'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/d98zwIsA2bB9SfEk4Agv9C_CkuY"',
#                     'id': 'me',
#                     'kind': 'drive#permission',
#                     'role': 'owner',
#                     'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/permissions/me',
#                     'type': 'user'},
#  'version': '5',
#  'webContentLink': 'https://drive.google.com/uc?id=1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS&export=download',
#  'writersCanShare': True}

ここではファイル名から検索してファイルのIDを取得している。詳細は以下の記事を参照。

GoogleDriveFileオブジェクトは辞書のように扱える。

print(f['title'])
# lena.jpg

print(f['mimeType'])
# image/jpeg

print(f['fileSize'])
# 32468

print(f['parents'][0]['id'])
# 0AAeKIFCqYN07Uk9PVA

なお、FetchMetadata()を明示的に実行しなくても、辞書のようにキーを指定して値を取得すると、そのキーが存在しない場合は自動的にFetchMetadata()が実行されメタデータが取得される。

f = drive.CreateFile({'id': file_id})
print(f)
# GoogleDriveFile({'id': '1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS'})

print(f['title'])
# lena.jpg

print(f)
# GoogleDriveFile({'id': '1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS', 'kind': 'drive#file', 'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/MTU2MzI4NTE0MzkwNA"', 'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS', 'webContentLink': 'https://drive.google.com/uc?id=1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS&export=download', 'alternateLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/view?usp=drivesdk', 'embedLink': 'https://drive.google.com/file/d/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/preview?usp=drivesdk', 'iconLink': 'https://drive-thirdparty.googleusercontent.com/16/type/image/jpeg', 'thumbnailLink': 'https://lh3.googleusercontent.com/m2YVjD253FpwFFiz4ekc4Il6KIhP3LE1drWmH6zaJgWTKLDvVABj0ix8qIZmKunwEBR9U6yaKkc=s220', 'title': 'lena.jpg', 'mimeType': 'image/jpeg', 'labels': {'starred': False, 'hidden': False, 'trashed': False, 'restricted': False, 'viewed': True}, 'copyRequiresWriterPermission': False, 'createdDate': '2019-07-16T13:42:18.959Z', 'modifiedDate': '2019-07-16T13:52:23.904Z', 'modifiedByMeDate': '2019-07-16T13:52:23.904Z', 'lastViewedByMeDate': '2019-07-16T13:52:23.904Z', 'markedViewedByMeDate': '1970-01-01T00:00:00.000Z', 'version': '5', 'parents': [{'kind': 'drive#parentReference', 'id': '0AAeKIFCqYN07Uk9PVA', 'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/parents/0AAeKIFCqYN07Uk9PVA', 'parentLink': 'https://www.googleapis.com/drive/v2/files/0AAeKIFCqYN07Uk9PVA', 'isRoot': True}], 'downloadUrl': 'https://doc-14-2c-docs.googleusercontent.com/docs/securesc/dau8ajrf53dp30a065bvma64rthbbkv8/a79cnfgqkdr0hhjgseunhbajkeurcjgk/1563278400000/15529215658844670952/15529215658844670952/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS?e=download&gd=true', 'userPermission': {'kind': 'drive#permission', 'etag': '"_sqIxUq0fTLFIA17mBQDotbHWsg/d98zwIsA2bB9SfEk4Agv9C_CkuY"', 'id': 'me', 'selfLink': 'https://www.googleapis.com/drive/v2/files/1urYj2HbvV6kNfYsT8A-2PsmEjdiR2nZS/permissions/me', 'role': 'owner', 'type': 'user'}, 'originalFilename': 'lena.jpg', 'fileExtension': 'jpg', 'md5Checksum': '18f790b9a2e45f9d7e37174df7714249', 'fileSize': '32468', 'quotaBytesUsed': '32468', 'ownerNames': ['nkmk on'], 'owners': [{'kind': 'drive#user', 'displayName': 'nkmk on', 'isAuthenticatedUser': True, 'permissionId': '15529215658844670952', 'emailAddress': 'nkmk.on@gmail.com'}], 'lastModifyingUserName': 'nkmk on', 'lastModifyingUser': {'kind': 'drive#user', 'displayName': 'nkmk on', 'isAuthenticatedUser': True, 'permissionId': '15529215658844670952', 'emailAddress': 'nkmk.on@gmail.com'}, 'capabilities': {'canCopy': True, 'canEdit': True}, 'editable': True, 'copyable': True, 'writersCanShare': True, 'shared': False, 'explicitlyTrashed': False, 'appDataContents': False, 'headRevisionId': '0BweKIFCqYN07TDJNRXhEUll4cDJ2S3MySGJtTG1sc0pvSFkwPQ', 'imageMediaMetadata': {'width': 400, 'height': 225, 'rotation': 0}, 'spaces': ['drive']})

メタデータの値を変更したい場合は、値を更新してからUpload()する。

f['title'] = 'lena_new.jpg'
f.Upload()

print(f['title'])
# lena_new.jpg

すべての項目が変更できるわけではない。当然ながらファイルサイズなどは不変。

f['fileSize'] = '100'
f.Upload()

print(f['fileSize'])
# 32468

またCreateFile()GoogleDriveFileオブジェクトを生成したあとそのまま値を追加してUpload()しても変更は反映されない。FetchMetadata()などでメタデータを取得する必要があるので注意。

f = drive.CreateFile({'id': file_id})
f['title'] = 'lena.jpg'
f.Upload()

print(f['title'])
# lena_new.jpg

f = drive.CreateFile({'id': file_id})
f.FetchMetadata()
f['title'] = 'lena.jpg'
f.Upload()

print(f['title'])
# lena.jpg

Googleドライブのファイルをダウンロード

Googleドライブのファイルをダウンロードするには、'id'が設定されたGoogleDriveFileオブジェクトを用意し、GetContentFile()を呼ぶ。引数にはファイル名(パス)を指定する。

file_id = drive.ListFile({'q': 'title = "lena.jpg"'}).GetList()[0]['id']

f = drive.CreateFile({'id': file_id})
f.GetContentFile('dst/download_img.jpg')

'title'をファイル名として使用することもできる。

f = drive.CreateFile({'id': file_id})
f.GetContentFile(os.path.join('dst', f['title']))

ディレクトリを含むパスを指定する場合、保存先のディレクトリは前もって作成しておく必要があるので注意。自動的に作ってくれたりはしない。ディレクトリの作成にはos.makedirs()などが使える。

フォルダをまるごとダウンロードしたい場合は以下の記事を参照。

Googleドライブのファイルを削除

上述のように、スコープによっては認証されたアプリケーションで作成したファイルの削除しか許可されていない場合があるので注意。

フォルダの削除については以下の記事を参照。

ゴミ箱に入れる・ゴミ箱から戻す

Googleドライブ上のゴミ箱に入れるのはTrash()、ゴミ箱から戻すのはUnTrash()

ゴミ箱に入っているかどうかは'labels''trashed'で確認できる。

file_id = drive.ListFile({'q': 'title = "lena.jpg"'}).GetList()[0]['id']

f = drive.CreateFile({'id': file_id})
print(f['labels']['trashed'])
# False

f.Trash()
print(f['labels']['trashed'])
# True

f.UnTrash()
print(f['labels']['trashed'])
# False

完全に削除

完全に削除するのはDelete()Delete()したファイルは二度と復元できない。

f.Delete()

# f.FetchMetadata()
# ApiRequestError: <HttpError 404 when requesting https://www.googleapis.com/drive/v2/files/1AT2UizaLXFXiAcwGMGPqcBop7-jmGiTf?alt=json returned "File not found: 1AT2UizaLXFXiAcwGMGPqcBop7-jmGiTf">
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事