La documentación actual para guardar un archivo en Google Drive usando Python se puede encontrar aquí: https://developers.google.com/drive/v3/web/manage-uploads
Sin embargo, la forma en que la API api maneja el almacenamiento y recuperación de documentos no sigue la misma arquitectura que los sistemas de archivos POSIX. Como resultado, si desea preservar la arquitectura jerárquica de los archivos anidados en su sistema de archivos de Linux, necesitará escribir una gran cantidad de código personalizado para que los directorios principales se conserven en la unidad de Google.
Además de eso, google hace que sea difícil obtener acceso de escritura a una cuenta de disco normal. Su alcance de permiso debe incluir el siguiente enlace: https://www.googleapis.com/auth/drive y para obtener un token para acceder a la cuenta normal de un usuario, ese usuario debe primero join a group para proporcionar acceso a aplicaciones no revisadas. Y cualquier token oauth que se cree tiene una vida útil limitada.
Sin embargo, si obtiene un token de acceso, la siguiente secuencia de comandos debería permitirle guardar cualquier archivo en su máquina local en la misma ruta (relativa) en la unidad de google.
def migrate(file_path, access_token, drive_space='drive'):
'''
a method to save a posix file architecture to google drive
NOTE: to write to a google drive account using a non-approved app,
the oauth2 grantee account must also join this google group
https://groups.google.com/forum/#!forum/risky-access-by-unreviewed-apps
:param file_path: string with path to local file
:param access_token: string with oauth2 access token grant to write to google drive
:param drive_space: string with name of space to write to (drive, appDataFolder, photos)
:return: string with id of file on google drive
'''
# construct drive client
import httplib2
from googleapiclient import discovery
from oauth2client.client import AccessTokenCredentials
google_credentials = AccessTokenCredentials(access_token, 'my-user-agent/1.0')
google_http = httplib2.Http()
google_http = google_credentials.authorize(google_http)
google_drive = discovery.build('drive', 'v3', http=google_http)
drive_client = google_drive.files()
# prepare file body
from googleapiclient.http import MediaFileUpload
media_body = MediaFileUpload(filename=file_path, resumable=True)
# determine file modified time
import os
from datetime import datetime
modified_epoch = os.path.getmtime(file_path)
modified_time = datetime.utcfromtimestamp(modified_epoch).isoformat()
# determine path segments
path_segments = file_path.split(os.sep)
# construct upload kwargs
create_kwargs = {
'body': {
'name': path_segments.pop(),
'modifiedTime': modified_time
},
'media_body': media_body,
'fields': 'id'
}
# walk through parent directories
parent_id = ''
if path_segments:
# construct query and creation arguments
walk_folders = True
folder_kwargs = {
'body': {
'name': '',
'mimeType' : 'application/vnd.google-apps.folder'
},
'fields': 'id'
}
query_kwargs = {
'spaces': drive_space,
'fields': 'files(id, parents)'
}
while path_segments:
folder_name = path_segments.pop(0)
folder_kwargs['body']['name'] = folder_name
# search for folder id in existing hierarchy
if walk_folders:
walk_query = "name = '%s'" % folder_name
if parent_id:
walk_query += "and '%s' in parents" % parent_id
query_kwargs['q'] = walk_query
response = drive_client.list(**query_kwargs).execute()
file_list = response.get('files', [])
else:
file_list = []
if file_list:
parent_id = file_list[0].get('id')
# or create folder
# https://developers.google.com/drive/v3/web/folder
else:
if not parent_id:
if drive_space == 'appDataFolder':
folder_kwargs['body']['parents'] = [ drive_space ]
else:
del folder_kwargs['body']['parents']
else:
folder_kwargs['body']['parents'] = [parent_id]
response = drive_client.create(**folder_kwargs).execute()
parent_id = response.get('id')
walk_folders = False
# add parent id to file creation kwargs
if parent_id:
create_kwargs['body']['parents'] = [parent_id]
elif drive_space == 'appDataFolder':
create_kwargs['body']['parents'] = [drive_space]
# send create request
file = drive_client.create(**create_kwargs).execute()
file_id = file.get('id')
return file_id
PS. Modifiqué este script desde el módulo labpack
python. Hay una clase llamada driveClient en ese módulo escrita por rcj1492 que se encarga de guardar, cargar, buscar y eliminar archivos en la unidad de google de una manera que preserve el sistema de archivos POSIX.
from labpack.storage.google.drive import driveClient
¿Cuál es la forma de cargar en g en 2016? –