Skip to content

Instantly share code, notes, and snippets.

@0leynik
Last active October 29, 2020 01:14
Show Gist options
  • Save 0leynik/0a59bebeb1f1ff3d003eb9aeb5971125 to your computer and use it in GitHub Desktop.
Save 0leynik/0a59bebeb1f1ff3d003eb9aeb5971125 to your computer and use it in GitHub Desktop.
Download and upload files with GoogleDrive
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Download and upload files with GoogleDrive",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/0leynik/0a59bebeb1f1ff3d003eb9aeb5971125/download-and-upload-files-with-googledrive.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"metadata": {
"colab_type": "text",
"id": "wRToDUnDaIIW"
},
"cell_type": "markdown",
"source": [
"# Download and upload files and folders with GoogleDrive"
]
},
{
"metadata": {
"id": "697rlh_UwpH-",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Import modules and authenticate Google Drive"
]
},
{
"metadata": {
"id": "MrHbgAGVjZp4",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import os\n",
"from urllib import parse\n",
"import glob\n",
"\n",
"# PyDrive\n",
"!pip install -U -q PyDrive\n",
"from pydrive.auth import GoogleAuth\n",
"from pydrive.drive import GoogleDrive\n",
"from google.colab import auth\n",
"from oauth2client.client import GoogleCredentials\n",
"\n",
"\n",
"# Authenticate and create the PyDrive client\n",
"auth.authenticate_user()\n",
"gauth = GoogleAuth()\n",
"gauth.credentials = GoogleCredentials.get_application_default()\n",
"drive = GoogleDrive(gauth)\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "uJLpkHD9mpYM",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Downloading file or folder by GoogleDrive URL"
]
},
{
"metadata": {
"id": "eWOXMeHcmgIu",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"MIME_TYPES = {\n",
" 'application/vnd.google-apps.document':\n",
" 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n",
" \n",
" 'application/vnd.google-apps.spreadsheet':\n",
" 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n",
" \n",
" 'application/vnd.google-apps.presentation':\n",
" 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n",
" \n",
" 'application/vnd.google-apps.drawing':\n",
" 'application/pdf'\n",
"}\n",
"\n",
"\n",
"def downloadFromDriveFolder(gd_folder, local_parent_dir='.', verbose=True):\n",
" local_folder_path = os.path.join(local_parent_dir, gd_folder['title'])\n",
"\n",
" if not os.path.exists(local_folder_path):\n",
" os.makedirs(local_folder_path)\n",
" \n",
" gd_file_list = drive.ListFile({'q': \"'{}' in parents and trashed=false\".\\\n",
" format(gd_folder['id'])}).GetList()\n",
"\n",
" for gd_file in gd_file_list:\n",
" if gd_file['mimeType']=='application/vnd.google-apps.folder':\n",
" if verbose:\n",
" print(os.path.join(local_folder_path, gd_file['title']))\n",
" \n",
" downloadFromDriveFolder(gd_file, local_folder_path, verbose)\n",
" else:\n",
" if verbose:\n",
" print(os.path.join(local_folder_path, gd_file['title']))\n",
" \n",
" if gd_file['mimeType'] in MIME_TYPES:\n",
" gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']),\n",
" mimetype=MIME_TYPES[gd_file['mimeType']])\n",
" else:\n",
" gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']))\n",
"\n",
" \n",
"def downloadByDriveURL(url, local_parent_dir='.', verbose=True):\n",
" '''\n",
" Method to download a file or folder from the GoogleDrive.\n",
"\n",
" :param url: file or folder url in GoogleDrive\n",
" :param local_parent_dir: local parent directory that will be created if it does not exist\n",
" :param verbose: print downloading steps\n",
" '''\n",
" gd_file_id = parse.parse_qs(parse.urlparse(url).query)['id'][0]\n",
" gd_file = drive.CreateFile({'id': gd_file_id})\n",
" \n",
" if gd_file['mimeType']=='application/vnd.google-apps.folder':\n",
" if verbose:\n",
" print('Downloading folder \"{}\"...'.format(gd_file['title']))\n",
" \n",
" downloadFromDriveFolder(gd_file, local_parent_dir, verbose)\n",
" else:\n",
" if not os.path.exists(local_parent_dir):\n",
" os.makedirs(local_parent_dir)\n",
"\n",
" if verbose:\n",
" print('Downloading file \"{}\"...'.format(gd_file['title']))\n",
" print(os.path.join(local_parent_dir, gd_file['title']))\n",
" \n",
" if gd_file['mimeType'] in MIME_TYPES:\n",
" gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']),\n",
" mimetype=MIME_TYPES[gd_file['mimeType']])\n",
" else:\n",
" gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']))\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "xxxtDQDdm8Ht",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Uploading file or folder"
]
},
{
"metadata": {
"id": "-U64HHcFm693",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def uploadToDriveFolder(local_file_or_dir, gd_parent_folder=None, verbose=True):\n",
" if verbose:\n",
" print(local_file_or_dir)\n",
" \n",
" local_basename = os.path.basename(local_file_or_dir) \n",
" if os.path.isfile(local_file_or_dir):\n",
" if gd_parent_folder is None:\n",
" gd_file = drive.CreateFile({'title': local_basename})\n",
" else:\n",
" gd_file = drive.CreateFile(\n",
" {'title': local_basename,\n",
" 'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})\n",
" \n",
" gd_file.SetContentFile(local_file_or_dir)\n",
" gd_file.Upload()\n",
" \n",
" elif os.path.isdir(local_file_or_dir):\n",
" if gd_parent_folder is None:\n",
" gd_folder = drive.CreateFile(\n",
" {'title': local_basename,\n",
" 'mimeType': 'application/vnd.google-apps.folder'})\n",
" else:\n",
" gd_folder = drive.CreateFile(\n",
" {'title': local_basename,\n",
" 'mimeType': 'application/vnd.google-apps.folder',\n",
" 'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})\n",
" \n",
" gd_folder.Upload()\n",
" for local_path in glob.iglob(os.path.join(local_file_or_dir,'*')):\n",
" uploadToDriveFolder(local_path, gd_folder)\n",
"\n",
"\n",
"def uploadToDrive(local_file_or_dir, gd_parent_folder_name=None,gd_parent_folder_url=None,\n",
" verbose=True):\n",
" '''\n",
" Method to upload a file or folder to the GoogleDrive.\n",
" \n",
" Set one of two parameters \"gd_parent_folder_name\"\n",
" or \"gd_parent_folder_url\" to specify the parent folder.\n",
" \n",
" If the parameters \"gd_parent_folder_name\" and \"gd_parent_folder_url\" are not defined,\n",
" the files are uploaded to the root folder of the user.\n",
"\n",
" :param local_file_or_dir: local file or directory to upload to GoogleDrive\n",
" :param gd_parent_folder_name: name of parent folder that will be created in GoogleDrive\n",
" :param gd_parent_folder_url: url of existing parent folder in GoogleDrive\n",
" :param verbose: print uploading steps\n",
" '''\n",
" if not os.path.exists(local_file_or_dir):\n",
" raise Exception('Local file or directory not found\"!')\n",
" \n",
" if gd_parent_folder_url is not None and gd_parent_folder_name is not None:\n",
" raise Exception('Set one of two parameters: \"gd_parent_folder_url\"'\\\n",
" ' or \"gd_parent_folder_name\"!')\n",
" \n",
" if gd_parent_folder_url is not None:\n",
" gd_parent_folder_id = parse.parse_qs(parse.urlparse(gd_parent_folder_url).query)['id'][0]\n",
" gd_parent_folder = drive.CreateFile({'id': gd_parent_folder_id})\n",
" if gd_parent_folder['mimeType']!='application/vnd.google-apps.folder':\n",
" raise Exception('\"{}\" is not folder!'.format(gd_parent_folder['title']))\n",
" if verbose:\n",
" print('Uploading \"{}\" to \"{}\" by folder url...'.\\\n",
" format(local_file_or_dir, gd_parent_folder['title']))\n",
" uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)\n",
" \n",
" elif gd_parent_folder_name is not None:\n",
" if verbose:\n",
" print('Uploading \"{}\" to \"{}\" by folder name...'.\\\n",
" format(local_file_or_dir, gd_parent_folder_name))\n",
" gd_parent_folder = drive.CreateFile(\n",
" {'title': gd_parent_folder_name,\n",
" 'mimeType': 'application/vnd.google-apps.folder'})\n",
" gd_parent_folder.Upload()\n",
" uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)\n",
" \n",
" else:\n",
" if verbose:\n",
" print('Uploading \"{}\" to root GoogleDrive...'.format(local_file_or_dir))\n",
" uploadToDriveFolder(local_file_or_dir,verbose=verbose)\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "arfFZL0S0nx1",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Usage example"
]
},
{
"metadata": {
"id": "o456ZyMHYPBX",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Download"
]
},
{
"metadata": {
"id": "-bsI-eF4Neyz",
"colab_type": "code",
"outputId": "ed75982e-fc22-4ec9-c9e8-52b358b15493",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 102
}
},
"cell_type": "code",
"source": [
"# Download folder to current directory\n",
"downloadByDriveURL('https://drive.google.com/open?id=1RkY0NDZUDZx3WA0Fmmfc2G77MFdcyU8b')"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"Downloading folder \"Glasses\"...\n",
"./Glasses/dataset\n",
"./Glasses/dataset/val.h5\n",
"./Glasses/dataset/train.h5\n",
"./Glasses/dataset/test.h5\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "Tl5VaXuANCbJ",
"colab_type": "code",
"outputId": "154a8d08-a2bc-4afa-ed52-d5069604c135",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"cell_type": "code",
"source": [
"# Download file to \"test\" directory\n",
"downloadByDriveURL('https://drive.google.com/open?id=1ah5hhhSTCAMjiuXeuAQZE1PqcqF2jDaL',\n",
" 'test_dir')"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"Downloading file \"val.h5\"...\n",
"test_dir/val.h5\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "95Pb785-Rwvw",
"colab_type": "code",
"outputId": "879c2daa-4422-484e-f87f-3d0a7092a200",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 697
}
},
"cell_type": "code",
"source": [
"downloadByDriveURL('https://drive.google.com/open?id=0B2zoFVYw1rN3WUZUS2ZGWmhobkU')"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": [
"Downloading folder \"DeepBayes slides\"...\n",
"./DeepBayes slides/Выступления партнеров\n",
"./DeepBayes slides/Выступления партнеров/Сбербанк.pptx\n",
"./DeepBayes slides/Выступления партнеров/Kaspersky.pdf\n",
"./DeepBayes slides/Выступления партнеров/Yandex.pptx\n",
"./DeepBayes slides/Выступления партнеров/Yandex.pdf\n",
"./DeepBayes slides/26 авг сб\n",
"./DeepBayes slides/26 авг сб/Lecture 1.pdf\n",
"./DeepBayes slides/26 авг сб/Презентация к семинару.pdf\n",
"./DeepBayes slides/26 авг сб/Seminar 1 tasks.pdf\n",
"./DeepBayes slides/26 авг сб/Lecture 3.pdf\n",
"./DeepBayes slides/26 авг сб/saddle_point_evaluation_optimizers.gif\n",
"./DeepBayes slides/26 авг сб/contours_evaluation_optimizers.gif\n",
"./DeepBayes slides/26 авг сб/Lecture 2.pdf\n",
"./DeepBayes slides/26 авг сб/Opening remarks.pdf\n",
"./DeepBayes slides/30 авг ср\n",
"./DeepBayes slides/30 авг ср/Seminar\n",
"./DeepBayes slides/30 авг ср/Conjugate\n",
"./DeepBayes slides/30 авг ср/seminar.ipynb\n",
"./DeepBayes slides/30 авг ср/Bayesian Neural Networks DeepBayes School.pptx\n",
"./DeepBayes slides/30 авг ср/SVDO DeepBayes School.pptx\n",
"./DeepBayes slides/30 авг ср/SVDO DeepBayes School.pptx\n",
"./DeepBayes slides/30 авг ср/Bayesian Neural Networks DeepBayes School.pptx\n",
"./DeepBayes slides/30 авг ср/generative_models.pptx\n",
"./DeepBayes slides/30 авг ср/generative_models.pdf\n",
"./DeepBayes slides/30 авг ср/gan_1d.mp4\n",
"./DeepBayes slides/29 авг вт\n",
"./DeepBayes slides/29 авг вт/GP_lecture.pdf\n",
"./DeepBayes slides/29 авг вт/Scalable_GPs.pdf\n",
"./DeepBayes slides/29 авг вт/Scalable_MCMC_Deep_Bayes_school.pdf\n",
"./DeepBayes slides/28 авг пн\n",
"./DeepBayes slides/28 авг пн/Attention models for deep learning\n",
"./DeepBayes slides/28 авг пн/RNN_DeepBayes.pdf\n",
"./DeepBayes slides/28 авг пн/BRL.pdf\n",
"./DeepBayes slides/27 авг вс\n",
"./DeepBayes slides/27 авг вс/deepbayes-dl-libs\n",
"./DeepBayes slides/27 авг вс/regularizations.pdf\n",
"./DeepBayes slides/27 авг вс/deepbayes-dl-libs.gslides\n",
"./DeepBayes slides/27 авг вс/Lecture 4.pdf\n",
"./DeepBayes slides/27 авг вс/Lecture 5.pdf\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "1KEt7HE3YZYV",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Upload"
]
},
{
"metadata": {
"id": "hpo-n28MU7vQ",
"colab_type": "code",
"outputId": "784046f7-e801-4cee-e826-2e49b8aaab5a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 680
}
},
"cell_type": "code",
"source": [
"# Upload directory to root folder of the user on GoogleDrive\n",
"uploadToDrive('DeepBayes slides')"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"Uploading \"DeepBayes slides\" to root GoogleDrive...\n",
"DeepBayes slides\n",
"DeepBayes slides/Выступления партнеров\n",
"DeepBayes slides/Выступления партнеров/Yandex.pptx\n",
"DeepBayes slides/Выступления партнеров/Сбербанк.pptx\n",
"DeepBayes slides/Выступления партнеров/Kaspersky.pdf\n",
"DeepBayes slides/Выступления партнеров/Yandex.pdf\n",
"DeepBayes slides/27 авг вс\n",
"DeepBayes slides/27 авг вс/Lecture 4.pdf\n",
"DeepBayes slides/27 авг вс/Lecture 5.pdf\n",
"DeepBayes slides/27 авг вс/deepbayes-dl-libs\n",
"DeepBayes slides/27 авг вс/regularizations.pdf\n",
"DeepBayes slides/27 авг вс/deepbayes-dl-libs.gslides\n",
"DeepBayes slides/26 авг сб\n",
"DeepBayes slides/26 авг сб/Презентация к семинару.pdf\n",
"DeepBayes slides/26 авг сб/Seminar 1 tasks.pdf\n",
"DeepBayes slides/26 авг сб/Lecture 1.pdf\n",
"DeepBayes slides/26 авг сб/Lecture 2.pdf\n",
"DeepBayes slides/26 авг сб/Lecture 3.pdf\n",
"DeepBayes slides/26 авг сб/saddle_point_evaluation_optimizers.gif\n",
"DeepBayes slides/26 авг сб/Opening remarks.pdf\n",
"DeepBayes slides/26 авг сб/contours_evaluation_optimizers.gif\n",
"DeepBayes slides/28 авг пн\n",
"DeepBayes slides/28 авг пн/BRL.pdf\n",
"DeepBayes slides/28 авг пн/Attention models for deep learning\n",
"DeepBayes slides/28 авг пн/RNN_DeepBayes.pdf\n",
"DeepBayes slides/29 авг вт\n",
"DeepBayes slides/29 авг вт/Scalable_GPs.pdf\n",
"DeepBayes slides/29 авг вт/GP_lecture.pdf\n",
"DeepBayes slides/29 авг вт/Scalable_MCMC_Deep_Bayes_school.pdf\n",
"DeepBayes slides/30 авг ср\n",
"DeepBayes slides/30 авг ср/seminar.ipynb\n",
"DeepBayes slides/30 авг ср/generative_models.pptx\n",
"DeepBayes slides/30 авг ср/generative_models.pdf\n",
"DeepBayes slides/30 авг ср/gan_1d.mp4\n",
"DeepBayes slides/30 авг ср/Seminar\n",
"DeepBayes slides/30 авг ср/Bayesian Neural Networks DeepBayes School.pptx\n",
"DeepBayes slides/30 авг ср/SVDO DeepBayes School.pptx\n",
"DeepBayes slides/30 авг ср/Conjugate\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "ZcZu1MKGO4gv",
"colab_type": "code",
"outputId": "a8f95265-533e-4cb4-94a6-cbe457dc3dc6",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
}
},
"cell_type": "code",
"source": [
"# Upload directory to new folder \"Folder on GD\" on GoogleDrive\n",
"uploadToDrive('Glasses', 'Folder on GD')"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"Uploading \"Glasses\" to \"Folder on GD\" by folder name...\n",
"Glasses\n",
"Glasses/dataset\n",
"Glasses/dataset/test.h5\n",
"Glasses/dataset/val.h5\n",
"Glasses/dataset/train.h5\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "Ia1Q9nHaO63Z",
"colab_type": "code",
"outputId": "a709735b-cb97-4c7a-9e28-8bfda67740b4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"cell_type": "code",
"source": [
"# Upload file to existing folder \"Folder on GD\" on GoogleDrive\n",
"uploadToDrive('test_dir/val.h5',\n",
" gd_parent_folder_url='https://drive.google.com/open?id=18H1ju3et05tHLIbVZB2OxXKKqqx1GEdp')\n",
"# or uploadToDrive('test_dir/val.h5', None, 'https://drive.google.com/open?id=18H1ju3et05tHLIbVZB2OxXKKqqx1GEdp')"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"Uploading \"test_dir/val.h5\" to \"Folder on GD\" by folder url...\n",
"test_dir/val.h5\n"
],
"name": "stdout"
}
]
}
]
}
import os
from urllib import parse
import glob
# PyDrive
!pip install -U -q PyDrive
!pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
# Authenticate and create the PyDrive client (need file 'client_secrets.json' to auth)
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)
MIME_TYPES = {
'application/vnd.google-apps.document':
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.google-apps.spreadsheet':
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.google-apps.presentation':
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.google-apps.drawing':
'application/pdf'
}
def downloadFromDriveFolder(gd_folder, local_parent_dir='.', verbose=True):
local_folder_path = os.path.join(local_parent_dir, gd_folder['title'])
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path)
gd_file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".\
format(gd_folder['id'])}).GetList()
for gd_file in gd_file_list:
if gd_file['mimeType']=='application/vnd.google-apps.folder':
if verbose:
print(os.path.join(local_folder_path, gd_file['title']))
downloadFromDriveFolder(gd_file, local_folder_path, verbose)
else:
if verbose:
print(os.path.join(local_folder_path, gd_file['title']))
if gd_file['mimeType'] in MIME_TYPES:
gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']),
mimetype=MIME_TYPES[gd_file['mimeType']])
else:
gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']))
def downloadByDriveURL(url, local_parent_dir='.', verbose=True):
'''
Method to download a file or folder from the GoogleDrive.
:param url: file or folder url in GoogleDrive
:param local_parent_dir: local parent directory that will be created if it does not exist
:param verbose: print downloading steps
'''
gd_file_id = parse.parse_qs(parse.urlparse(url).query)['id'][0]
gd_file = drive.CreateFile({'id': gd_file_id})
if gd_file['mimeType']=='application/vnd.google-apps.folder':
if verbose:
print('Downloading folder "{}"...'.format(gd_file['title']))
downloadFromDriveFolder(gd_file, local_parent_dir, verbose)
else:
if not os.path.exists(local_parent_dir):
os.makedirs(local_parent_dir)
if verbose:
print('Downloading file "{}"...'.format(gd_file['title']))
print(os.path.join(local_parent_dir, gd_file['title']))
if gd_file['mimeType'] in MIME_TYPES:
gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']),
mimetype=MIME_TYPES[gd_file['mimeType']])
else:
gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']))
def uploadToDriveFolder(local_file_or_dir, gd_parent_folder=None, verbose=True):
if verbose:
print(local_file_or_dir)
local_basename = os.path.basename(local_file_or_dir)
if os.path.isfile(local_file_or_dir):
if gd_parent_folder is None:
gd_file = drive.CreateFile({'title': local_basename})
else:
gd_file = drive.CreateFile(
{'title': local_basename,
'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})
gd_file.SetContentFile(local_file_or_dir)
gd_file.Upload()
elif os.path.isdir(local_file_or_dir):
if gd_parent_folder is None:
gd_folder = drive.CreateFile(
{'title': local_basename,
'mimeType': 'application/vnd.google-apps.folder'})
else:
gd_folder = drive.CreateFile(
{'title': local_basename,
'mimeType': 'application/vnd.google-apps.folder',
'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})
gd_folder.Upload()
for local_path in glob.iglob(os.path.join(local_file_or_dir,'*')):
uploadToDriveFolder(local_path, gd_folder)
def uploadToDrive(local_file_or_dir, gd_parent_folder_name=None,gd_parent_folder_url=None,
verbose=True):
'''
Method to upload a file or folder to the GoogleDrive.
Set one of two parameters "gd_parent_folder_name"
or "gd_parent_folder_url" to specify the parent folder.
If the parameters "gd_parent_folder_name" and "gd_parent_folder_url" are not defined,
the files are uploaded to the root folder of the user.
:param local_file_or_dir: local file or directory to upload to GoogleDrive
:param gd_parent_folder_name: name of parent folder that will be created in GoogleDrive
:param gd_parent_folder_url: url of existing parent folder in GoogleDrive
:param verbose: print uploading steps
'''
if not os.path.exists(local_file_or_dir):
raise Exception('Local file or directory not found"!')
if gd_parent_folder_url is not None and gd_parent_folder_name is not None:
raise Exception('Set one of two parameters: "gd_parent_folder_url"'\
' or "gd_parent_folder_name"!')
if gd_parent_folder_url is not None:
gd_parent_folder_id = parse.parse_qs(parse.urlparse(gd_parent_folder_url).query)['id'][0]
gd_parent_folder = drive.CreateFile({'id': gd_parent_folder_id})
if gd_parent_folder['mimeType']!='application/vnd.google-apps.folder':
raise Exception('"{}" is not folder!'.format(gd_parent_folder['title']))
if verbose:
print('Uploading "{}" to "{}" by folder url...'.\
format(local_file_or_dir, gd_parent_folder['title']))
uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)
elif gd_parent_folder_name is not None:
if verbose:
print('Uploading "{}" to "{}" by folder name...'.\
format(local_file_or_dir, gd_parent_folder_name))
gd_parent_folder = drive.CreateFile(
{'title': gd_parent_folder_name,
'mimeType': 'application/vnd.google-apps.folder'})
gd_parent_folder.Upload()
uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)
else:
if verbose:
print('Uploading "{}" to root GoogleDrive...'.format(local_file_or_dir))
uploadToDriveFolder(local_file_or_dir,verbose=verbose)
import os
from urllib import parse
import glob
# PyDrive
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# Authenticate and create the PyDrive client
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
MIME_TYPES = {
'application/vnd.google-apps.document':
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.google-apps.spreadsheet':
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.google-apps.presentation':
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.google-apps.drawing':
'application/pdf'
}
def downloadFromDriveFolder(gd_folder, local_parent_dir='.', verbose=True):
local_folder_path = os.path.join(local_parent_dir, gd_folder['title'])
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path)
gd_file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".\
format(gd_folder['id'])}).GetList()
for gd_file in gd_file_list:
if gd_file['mimeType']=='application/vnd.google-apps.folder':
if verbose:
print(os.path.join(local_folder_path, gd_file['title']))
downloadFromDriveFolder(gd_file, local_folder_path, verbose)
else:
if verbose:
print(os.path.join(local_folder_path, gd_file['title']))
if gd_file['mimeType'] in MIME_TYPES:
gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']),
mimetype=MIME_TYPES[gd_file['mimeType']])
else:
gd_file.GetContentFile(os.path.join(local_folder_path, gd_file['title']))
def downloadByDriveURL(url, local_parent_dir='.', verbose=True):
'''
Method to download a file or folder from the GoogleDrive.
:param url: file or folder url in GoogleDrive
:param local_parent_dir: local parent directory that will be created if it does not exist
:param verbose: print downloading steps
'''
gd_file_id = parse.parse_qs(parse.urlparse(url).query)['id'][0]
gd_file = drive.CreateFile({'id': gd_file_id})
if gd_file['mimeType']=='application/vnd.google-apps.folder':
if verbose:
print('Downloading folder "{}"...'.format(gd_file['title']))
downloadFromDriveFolder(gd_file, local_parent_dir, verbose)
else:
if not os.path.exists(local_parent_dir):
os.makedirs(local_parent_dir)
if verbose:
print('Downloading file "{}"...'.format(gd_file['title']))
print(os.path.join(local_parent_dir, gd_file['title']))
if gd_file['mimeType'] in MIME_TYPES:
gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']),
mimetype=MIME_TYPES[gd_file['mimeType']])
else:
gd_file.GetContentFile(os.path.join(local_parent_dir, gd_file['title']))
def uploadToDriveFolder(local_file_or_dir, gd_parent_folder=None, verbose=True):
if verbose:
print(local_file_or_dir)
local_basename = os.path.basename(local_file_or_dir)
if os.path.isfile(local_file_or_dir):
if gd_parent_folder is None:
gd_file = drive.CreateFile({'title': local_basename})
else:
gd_file = drive.CreateFile(
{'title': local_basename,
'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})
gd_file.SetContentFile(local_file_or_dir)
gd_file.Upload()
elif os.path.isdir(local_file_or_dir):
if gd_parent_folder is None:
gd_folder = drive.CreateFile(
{'title': local_basename,
'mimeType': 'application/vnd.google-apps.folder'})
else:
gd_folder = drive.CreateFile(
{'title': local_basename,
'mimeType': 'application/vnd.google-apps.folder',
'parents': [{'kind': 'drive#fileLink', 'id': gd_parent_folder['id']}]})
gd_folder.Upload()
for local_path in glob.iglob(os.path.join(local_file_or_dir,'*')):
uploadToDriveFolder(local_path, gd_folder)
def uploadToDrive(local_file_or_dir, gd_parent_folder_name=None,gd_parent_folder_url=None,
verbose=True):
'''
Method to upload a file or folder to the GoogleDrive.
Set one of two parameters "gd_parent_folder_name"
or "gd_parent_folder_url" to specify the parent folder.
If the parameters "gd_parent_folder_name" and "gd_parent_folder_url" are not defined,
the files are uploaded to the root folder of the user.
:param local_file_or_dir: local file or directory to upload to GoogleDrive
:param gd_parent_folder_name: name of parent folder that will be created in GoogleDrive
:param gd_parent_folder_url: url of existing parent folder in GoogleDrive
:param verbose: print uploading steps
'''
if not os.path.exists(local_file_or_dir):
raise Exception('Local file or directory not found"!')
if gd_parent_folder_url is not None and gd_parent_folder_name is not None:
raise Exception('Set one of two parameters: "gd_parent_folder_url"'\
' or "gd_parent_folder_name"!')
if gd_parent_folder_url is not None:
gd_parent_folder_id = parse.parse_qs(parse.urlparse(gd_parent_folder_url).query)['id'][0]
gd_parent_folder = drive.CreateFile({'id': gd_parent_folder_id})
if gd_parent_folder['mimeType']!='application/vnd.google-apps.folder':
raise Exception('"{}" is not folder!'.format(gd_parent_folder['title']))
if verbose:
print('Uploading "{}" to "{}" by folder url...'.\
format(local_file_or_dir, gd_parent_folder['title']))
uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)
elif gd_parent_folder_name is not None:
if verbose:
print('Uploading "{}" to "{}" by folder name...'.\
format(local_file_or_dir, gd_parent_folder_name))
gd_parent_folder = drive.CreateFile(
{'title': gd_parent_folder_name,
'mimeType': 'application/vnd.google-apps.folder'})
gd_parent_folder.Upload()
uploadToDriveFolder(local_file_or_dir, gd_parent_folder, verbose)
else:
if verbose:
print('Uploading "{}" to root GoogleDrive...'.format(local_file_or_dir))
uploadToDriveFolder(local_file_or_dir,verbose=verbose)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment