Текущая документацию для сохранения файла в Google диска с помощью питона можно найти здесь: https://developers.google.com/drive/v3/web/manage-uploads
Однако способ, с помощью которого api-устройство google обрабатывает хранение и извлечение документов, не соответствует той же архитектуре, что и файловые системы POSIX. В результате, если вы хотите сохранить иерархическую архитектуру вложенных файлов в вашей файловой системе Linux, вам нужно будет написать много настраиваемого кода, чтобы родительские каталоги сохранялись на диске Google.
Кроме того, google затрудняет доступ на запись к обычной учетной записи. Ваша область разрешений должна включать следующую ссылку: https://www.googleapis.com/auth/drive и для получения токена для доступа к обычной учетной записи пользователя, этот пользователь должен сначала join a group предоставить доступ к незарегистрированным приложениям. И любой маркер oauth, который создается, имеет ограниченный срок хранения.
Однако, если вы получаете токен доступа, следующий сценарий должен позволить вам сохранить любой файл на вашем локальном компьютере на том же (относительном) пути на 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. Я изменил этот скрипт из модуля python labpack
. В модуле, написанном rcj1492, есть класс, называемый driveClient, который обрабатывает сохранение, загрузку, поиск и удаление файлов на диске Google таким образом, который сохраняет файловую систему POSIX.
from labpack.storage.google.drive import driveClient
Что такое способ загрузки на g-накопитель 2016 года? –