LoginSignup
19
17

More than 5 years have passed since last update.

PyDriveでGoogle Driveの特定フォルダ配下のファイルをすべてダウンロードする

Last updated at Posted at 2018-06-26

PyDriveでフォルダごとダウンロードしたかったが、一発でできるメソッドなどがないっぽい。
以下コード。authは済んでいるものとする( gauth )。

import os
from pydrive.drive import GoogleDrive

drive = GoogleDrive(gauth)

drive_folder_id = '{ダウンロード対象フォルダのID}'
save_folder = '{保存先フォルダのパス(ローカル)}'


def download_recursively(save_folder, drive_folder_id):
    # 保存先フォルダがなければ作成
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)

    max_results = 100
    query = "'{}' in parents and trashed=false".format(drive_folder_id)

    for file_list in drive.ListFile({'q': query, 'maxResults': max_results}):
        for file in file_list:
            # mimeTypeでフォルダか判別
            if file['mimeType'] == 'application/vnd.google-apps.folder':
                download_recursively(os.path.join(save_folder, file['title']), file['id'])
            else:
                file.GetContentFile(os.path.join(save_folder, file['title']))


download_recursively(save_folder, drive_folder_id)

説明・補足

GoogleDriveのフォルダの扱い

Googleドライブのフォルダを扱う際、ローカルのファイルのようなパス形式 (e.g. hoge1/hoge2.txt)では扱うことができないっぽい。
フォルダを扱いたいときは、フォルダのIDを指定しなければならないらしい。

IDはWeb版GoogleDriveのURL↓の****の部分
https://drive.google.com/drive/u/0/folders/
****

drive.ListFile()で得られるファイルリストにはファイルもフォルダも含まれる。
フォルダに対してfile.GetContentFile()をしてもエラーが出てフォルダをダウンロードすることはできない。
mimeTypeでファイルとフォルダの判別を行う必要がある。

'q'

drive.ListFile({'q': {query}})のようにqueryを指定することで、得られるファイルリストに含めるファイルの条件を指定できる。

'{フォルダID}' in parentsで 指定のフォルダを親として持つファイルだけを抜き出せる。

また、trashed=falseを指定しないと、ゴミ箱に入っているファイルもリストに載ってしまうので注意。

その他の条件は以下参考
Search for Files and Team Drives | Drive REST API | Google Developers

'maxResults'

一度に取ってくるファイルの数(ファイルリストに含めるファイルの数)を指定する。
対象のファイルがあまりにも多い場合、一度に全部のファイルをとってくることができない。
(明確な上限値は公開されていない? ↓Stack Overflow 参照)
PyDriveの場合はmaxResultsを指定すればページングもよしなにやってくれる。

max_results100はマジックナンバー。特に意味はない。

参考

参考

  1. GitHub - gsuitedevs/PyDrive: Google Drive API Python wrapper library
  2. Welcome to PyDrive's documentation! — PyDrive 1.2.1 documentation
  3. Files: list | Drive REST API | Google Developers
  4. Search for Files and Team Drives | Drive REST API | Google Developers
  5. Google Drive API v3 を使ってみた - Qiita
  6. Clarification on maxResults and nextPageToken using Google Drive API v2 - Stack Overflow
19
17
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
19
17