LoginSignup
2
3

More than 5 years have passed since last update.

Googleドライブ上のファイル名をPython経由で変更する

Last updated at Posted at 2019-03-05

Googleドライブ上のファイルを自動で一括変更したかったので少し調べてやってみました。

実行環境

  • macOS Mojave
  • Python 3.7.2

まず,Googleドライブのファイルを操作するためのAPIですが,Googleの公式のAPI「Google Drive API」を使います。
QuickStartを参考にインストールします。(執筆時点でのAPIのバージョンは3です。)
QuickStartではcredentials.jsonがワークディレクトリにある想定になっています。ダウンロードして配置します。

スコープについて

Googleドライブのファイル名を変更するには,デフォルトの「https://www.googleapis.com/auth/drive.metadata.readonly
では権限が足りないのでここを参考にして「https://www.googleapis.com/auth/drive」に変更します。

ファイル名の変更

QuickStartにはファイル名の変更に関する情報がなかったので,Drive API v2を使ってやっているサイトとDrive APIのページを参考にしました。
以下,QuickStartの一部を改変したコードを示します。

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive']

def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)
    # Call the Drive v3 API
    results = service.files().list(
        pageSize=10, fields="nextPageToken, files(id, name)", q="name contains 'ファイル名'").execute()
    #q=で指定したファイル名のファイルを検索できます。
    items = results.get('files', [])
    if not items:
        print('No files found.')
    else:
        print('Files:')
        for item in items:
            #このまま実行するとitems内のファイルが全て変更されるので注意
            new_name = '変更後の名前'
            file = {'name': new_name}
            service.files().update(
                fileId=item['id'],
                body=file).execute()
if __name__ == '__main__':
    main()

ファイル名を変更しているのはservice.files().update()の部分です。
fileIdにはもともとのファイルのfileIdbodyには変更後のファイル名を入れた辞書型のオブジェクトを渡します。
とりあえずこれで動きましたがやり方があってるかは不明です。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3