Python, PyDriveでGoogle Driveのダウンロード、アップロード、削除など
PyDriveはgoogle-api-python-clientのラッパーライブラリ。これを利用するとPythonからGoogle Drive APIを簡単に処理できる。
- gsuitedevs/PyDrive: Google Drive API Python wrapper library
- Welcome to PyDrive’s documentation! — PyDrive 1.2.1 documentation
ここでは、PyDriveの基本的な使い方として、Googleドライブへファイルをダウンロードしたり、Googleドライブのファイルをリネームしたりダウンロードしたり削除したりする方法について説明する。
- PyDriveのインストール
- PyDriveが使っているのはGoogle Drive API v2
- Google Drive APIの利用登録
- OAuth認証
settings.yaml
の設定- Oauth認証を行うコード
- 注意点
- ローカルのファイルをアップロード
- テキストファイルを新規作成
- メタデータ(ファイル名など)の確認・変更
- Googleドライブのファイルをダウンロード
- Googleドライブのファイルを削除
- ゴミ箱に入れる・ゴミ箱から戻す
- 完全に削除
Googleドライブのフォルダの操作やファイルのリストの取得などについては以下の記事を参照。
- 関連記事: Python, PyDriveでGoogle Driveのフォルダ作成、ファイル移動、一括処理
- 関連記事: Python, PyDriveでGoogle Driveのファイルのリストを作成
なお、以下はPyDriveバージョン1.3.1
の情報。
PyDriveのインストール
pip
(環境によってはpip3
)でインストールできる。
$ pip install pydrive
PyDriveが使っているのはGoogle Drive API v2
バージョン1.3.1
の時点ではPyDriveはGoogle Drive API v2を使用している。
- Mention PyDrive uses v2 of Drive API · Issue #99 · gsuitedevs/PyDrive
- Upgrade to google drive V3 API · Issue #158 · gsuitedevs/PyDrive
Google Drive APIの最新バージョンはv3。ファイル名・フォルダ名を表すフィールドの名称がv2ではtitle
だがv3ではname
になっていたりする。大元のAPIの使用を調べるときは注意。
Google Drive APIの利用登録
Google Drive APIを利用するために以下のような登録作業が必要。
- プロジェクトの作成
- Google Developers Console
ダッシュボード
(左側ペインから選択)で新たなプロジェクトを作成- プロジェクトが一つもない場合は、プロジェクト作成のダイアログが表示される
- すでにプロジェクトがある場合は、左上(ロゴの右側)のプロジェクト選択から新規プロジェクトを作成する
- Google Drive APIの有効化
ダッシュボード
でAPIとサービスの有効化
をクリック- 検索ボックスに
Google Drive API
と入力して、選択、有効化
- 認証情報を作成
認証情報
(左側ペインから選択)で認証情報を作成認証情報を作成
→OAuthクライアントIDの作成
- 表示に従って
同意画面
を設定アプリケーション名
に適当な名前を入力すればOK
アプリケーションの種類
をその他
として認証情報を作成
- 表示に従って
- 作成した認証情報のJSONファイルをダウンロード
- 作成後、右側のダウンロードマーク(下矢印マーク)からダウンロード可能
Google Drive APIの利用登録については以下の記事でスクリーンショットとともに解説されている。画面のレイアウトが若干変わっているがほぼ同じ。
OAuth認証
PyDriveを使うとOAuth認証が簡単にできる。公式ドキュメントの該当部分は以下。
デフォルトではPythonのカレントディレクトリ(作業ディレクトリ)のclient_secrets.json
を認証情報のファイルとして確認するようになっているが、settings.yaml
というファイルを作成しておくことで柔軟な設定が可能。
settings.yamlの設定
settings.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_backend
をfile
に設定save_credentials_file
に保存先を設定
- ファイルで保存すると、2回目以降はブラウザを起動することなく認証できるので便利
-
get_refresh_token
False
(デフォルト):refresh token
を取得しないTrue
: :refresh token
を取得する
-
oauth_scope
- OAuth 2.0のスコープを設定
- デフォルト(省略した場合)は
https://www.googleapis.com/auth/drive
(フルアクセス) - スコープの種類は以下の公式ドキュメント参照
例1
認証情報をsettings.yaml
内に記述する例。client_id
とclient_secret
はGoogle 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認証を行うコード
settings.yaml
などを正しく準備して以下のコードを実行するとブラウザが起動し認証画面が表示される。
例えばChromeの場合はこのアプリは確認されていません
という警告画面が出るが、下部の詳細
のリンクから進むことができる。認証画面ではスコープの内容も表示される。
import os
from pydrive.auth import GoogleAuth
os.chdir(os.path.dirname(os.path.abspath(__file__)))
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
ここでは、os.chdir()
および__file__
などを利用して、カレントディレクトリをスクリプトファイル(.py
ファイル)のあるディレクトリに移動している。理由は次に説明する。
認証したアクセス権の解除はGoogleアカウントから行う。
注意点
カレントディレクトリ(作業ディレクトリ)
読み込むsettings.yaml
の場所を指定することはできず、常にカレントディレクトリ(Pythonを起動したディレクトリ = 作業ディレクトリ)のものが読み込まれる。
上のサンプルコードのようにカレントディレクトリを.py
ファイルの場所に移動するようにしてsettings.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">