Obecna dokumentacja do zapisywania pliku na Dysku Google przy użyciu Pythona można znaleźć tutaj: https://developers.google.com/drive/v3/web/manage-uploads
Jednak sposób, w jaki aplet google drive go obsługuje przechowywanie i pobieranie dokumentów, nie jest zgodny z architekturą systemu plików POSIX. W rezultacie, jeśli chcesz zachować hierarchiczną architekturę zagnieżdżonych plików w systemie plików linux, będziesz musiał napisać dużo niestandardowego kodu, aby katalogi nadrzędne były zachowane na dysku Google.
Co więcej, google utrudnia uzyskanie dostępu do zapisu na normalnym koncie. Twój zakres uprawnień musi zawierać następujący link: https://www.googleapis.com/auth/drive. Aby uzyskać token umożliwiający dostęp do zwykłego konta użytkownika, użytkownik musi najpierw uzyskać dostęp do nieocenionych aplikacji przez join a group. Każdy utworzony oauth ma ograniczony okres przydatności do użycia.
Jeśli jednak uzyskasz token dostępu, poniższy skrypt powinien umożliwić zapisanie dowolnego pliku na komputerze lokalnym na tej samej (względnej) ścieżce na dysku 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. Zmodyfikowałem ten skrypt z modułu python labpack
. Istnieje klasa o nazwie driveClient w tym module napisana przez rcj1492, która obsługuje zapisywanie, ładowanie, wyszukiwanie i usuwanie plików na dysku Google w sposób, który zachowuje system plików POSIX.
from labpack.storage.google.drive import driveClient
Jaki jest sposób na przesłanie pliku na dysk w 2016? –