"""Docstring for ``decorator``.
========================
Function Decorator
========================
==================== =========================================================
File Transfer
==============================================================================
gdrive_downloader File downloader from Google Drive.
gdrive_uploader File uploader to Google Drive.
==================== =========================================================
"""
import os
from glob import glob
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
# from google.colab import auth
from oauth2client.client import GoogleCredentials
__all__ = ['gdrive_downloader',
'gdrive_uploader']
[docs]def gdrive_downloader(gdrive_url_id, pattern='*', download_path='./data'):
"""Download files in Google Drive.
Download files in Googel Drive to the given path.
Parameters
----------
gdrive_url_id: str
An URL ID of an Google Drive directory which contains files to
download.
`https://drive.google.com/drive/folders/<google drive URL ID>`.
pattern: str (default: '*')
A pattern of regular expression to filter file in the target directory.
download_path: str (default: './data')
A target directory to download files in given URL ID.
Returns
-------
None
Nothing is returned.
See Also
--------
`PyDrive`
Examples
--------
>>> import unipy.util.gdrive import gdrive_downloader
>>> gdrive_path_id = '1LA5334-SZdizcFqkl4xO8Hty7w1q0e8h'
>>> up.gdrive_downloader(gdrive_path_id)
"""
# 1. Authenticate and create the PyDrive client.
# auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# 2. Create a directory for download.
try:
os.makedirs(download_path, exist_ok=False)
print("Creating a directory: '{path}'".format(path=download_path))
except FileExistsError:
print("Directory Exists: '{path}'".format(path=download_path))
# 3. Get a list of target files.
file_list = drive.ListFile(
{'q': "'{url_id}' in parents".format(url_id=gdrive_url_id)}).GetList()
# 4. Download it.
for file in file_list:
# 3. Create & download by id.
print('title: %s, id: %s' % (file['title'], file['id']))
fname = os.path.join('data', file['title'])
print('Downloading {fname} ...'.format(fname=fname))
f_ = drive.CreateFile({'id': file['id']})
f_.GetContentFile(fname)
print('\nDownload Finished.')
[docs]def gdrive_uploader(gdrive_url_id, pattern='*', src_dir='./data'):
"""Download files in Google Drive.
Download files in Googel Drive to the given path.
Parameters
----------
gdrive_url_id: str
An URL ID of an Google Drive directory to upload files.
`https://drive.google.com/drive/folders/<google drive URL ID>`.
pattern: str (default: '*')
A pattern of regular expression to filter file in the target directory.
src_dir: str (default: './data')
A source directory to upload files in given URL ID.
Returns
-------
None
Nothing is returned.
See Also
--------
`PyDrive`
Examples
--------
>>> import unipy.util.gdrive import gdrive_uploader
>>> gdrive_path_id = '1LA5334-SZdizcFqkl4xO8Hty7w1q0e8h'
>>> up.gdrive_uploader(gdrive_path_id)
"""
# 1. Authenticate and create the PyDrive client.
#auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# 2. Get a list of target files.
print("Uploading: '{path}'".format(path=src_dir))
file_list = glob(src_dir + '/*')
gdrive_exist_list = drive.ListFile(
{'q': "'{url_id}' in parents".format(url_id=gdrive_url_id)}).GetList()
gdrive_exist_name = [f['title'] for f in gdrive_exist_list]
for file in file_list:
fname = file.split('/')[-1]
if fname in gdrive_exist_name:
print("'{fname}' File exists. Updating it...".format(fname=fname))
f_ = [f for f in gdrive_exist_list if f['title'] == fname][0]
else:
print("Uploading '{fname}' ...".format(fname=fname))
f_ = drive.CreateFile({'title': fname,
"parents" : [{"id": gdrive_url_id}]})
f_.SetContentFile(file)
f_.Upload()
print('\nUpload Finished.')