Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save alexlib/53663b39f24c4d76998aa3ac9e7cdea9 to your computer and use it in GitHub Desktop.
Save alexlib/53663b39f24c4d76998aa3ac9e7cdea9 to your computer and use it in GitHub Desktop.
Simple Google Drive backup script with automatic authentication for Google Colaboratory (Python 3)
# Simple Google Drive backup script with automatic authentication
# for Google Colaboratory (Python 3)
# Instructions:
# 1. Run this cell and authenticate via the link and text box.
# 2. Copy the JSON output below this cell into the `mycreds_file_contents`
# variable. Authentication will occur automatically from now on.
# 3. Create a new folder in Google Drive and copy the ID of this folder
# from the URL bar to the `folder_id` variable.
# 4. Specify the directory to be backed up in `dir_to_backup`.
# Caveats:
# 1. The backup/restore functions override existing files both locally and
# remotely without warning.
# 2. Empty directories and files are ignored.
# 3. Use at your own risk.
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import google.colab
from oauth2client.client import GoogleCredentials
import glob, os
folder_id = 'GOOGLE_DRIVE_FOLDER_ID_HERE'
dir_to_backup = 'LOCAL_BACKUP_DIRECTORY_HERE'
mycreds_file_contents = 'PASTE_JSON_STRING_HERE'
mycreds_file = 'mycreds.json'
with open(mycreds_file, 'w') as f:
f.write(mycreds_file_contents)
def authenticate_pydrive():
gauth = GoogleAuth()
# https://stackoverflow.com/a/24542604/5096199
# Try to load saved client credentials
gauth.LoadCredentialsFile(mycreds_file)
if gauth.credentials is None:
# Authenticate if they're not there
google.colab.auth.authenticate_user()
gauth.credentials = GoogleCredentials.get_application_default()
elif gauth.access_token_expired:
# Refresh them if expired
gauth.Refresh()
else:
# Initialize the saved creds
gauth.Authorize()
# Save the current credentials to a file
gauth.SaveCredentialsFile(mycreds_file)
drive = GoogleDrive(gauth)
return drive
def backup_pydrive():
drive = authenticate_pydrive()
paths = list(glob.iglob(os.path.join(dir_to_backup, '**'), recursive=True))
print(paths)
# Delete existing files
files = drive.ListFile({'q': "'%s' in parents" % folder_id}).GetList()
for file in files:
if file['title'] in paths:
file.Delete()
for path in paths:
if os.path.isdir(path) or os.stat(path).st_size == 0:
continue
file = drive.CreateFile({'title': path, 'parents':
[{"kind": "drive#fileLink", "id": folder_id}]})
file.SetContentFile(path)
file.Upload()
print('Backed up %s' % path)
def restore_pydrive():
drive = authenticate_pydrive()
files = drive.ListFile({'q': "'%s' in parents" % folder_id}).GetList()
for file in files:
os.makedirs(os.path.dirname(file['title']), exist_ok=True)
file.GetContentFile(file['title'])
print('Restored %s' % file['title'])
authenticate_pydrive()
!cat {mycreds_file}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment