Создайте папку (если ее нет) на диске Google и загрузите в нее файл с помощью скрипта Python.

Пока я могу загрузить файл в папку, если она существует. Я не могу понять, как его создать. Поэтому, если папка не существует, мой скрипт умирает.

import sys
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gpath = '2015'
fname = 'Open Drive Replacements 06_01_2015.xls'

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList()
for file1 in file_list:
    if file1['title'] == gpath:
        id = file1['id']

file1 = drive.CreateFile({'title': fname, "parents":  [{"kind": "drive#fileLink","id": id}]})
file1.SetContentFile(fname)
file1.Upload()

Не могли бы вы помочь мне изменить приведенный выше код, чтобы создать папку gpath, если она не существует?


person Akshay Kalghatgi    schedule 01.06.2015    source источник
comment
Согласно документации: Папка — это файл с типом MIME application/vnd.google-apps.folder и без расширение. Таким образом, вы создадите папку почти так же, как вы уже создаете файл.   -  person kindall    schedule 02.06.2015
comment
возможный дубликат Как я могу создать новую папку с API Google Диска в Python?   -  person Gurupad Hegde    schedule 02.06.2015


Ответы (2)


На основании документации следует

file1 = drive.CreateFile({'title': fname, 
    "parents":  [{"id": id}], 
    "mimeType": "application/vnd.google-apps.folder"})

Обновление: по состоянию на апрель 2020 г. документация (v3) был обновлен документами API и показывает:

folder_id = '0BwwA4oUTeiV1TGRPeTVjaWRDY1E'
file_metadata = {
    'name': 'photo.jpg',
    'parents': [folder_id]
}
media = MediaFileUpload('files/photo.jpg',
                        mimetype='image/jpeg',
                        resumable=True)
file = drive_service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
print 'File ID: %s' % file.get('id')
person Gurupad Hegde    schedule 02.06.2015
comment
Для полноты вам также нужно будет вызвать .Upload() на file1 после того, как указано выше, чтобы фактически зафиксировать операцию. file1['id'] будет содержать id созданной папки. - person ; 29.03.2016
comment
Это не работает для меня. я получаю ответ GoogleDriveFile({'title': 'TEST-SOLAL-API', 'mimeType': 'application/vnd.google-apps.folder'}), но он не создает папки, которую я проверяю в исходном коде, и говорит This method would not upload a file to GoogleDrive. Я что-то упустил? - person Solal; 12.12.2019
comment
@Solal - документация должна быть обновлена. Метод CreateFile больше не упоминается в упомянутой документации. - person alofgran; 24.04.2020
comment
@Solal @alofgran эй, не правда ли, у меня CreateFile все еще работает как для создания файлов, так и для папок. @Solan, вы вызвали Upload() для объекта, возвращаемого при создании файла? - person SoundsSerious; 22.01.2021
comment
Я искал что-то подобное, но в Go, и это не работает, потому что он будет создавать каждый раз папку заново. Сейчас в документации не объясняется, как искать файлы в конкретной (многоуровневой) подпапке... По крайней мере, в Go нет ListFile для конкретной поддиректории... можно проверить, есть ли какое-то имя в одной из родителей ... но это будет что-то другое, чем точная папка. Должен быть способ, но он не задокументирован в присланной вами ссылке :( - person Jan; 21.06.2021

ответ выше не сработал для меня, это сработало. Возвращает идентификатор вновь созданной папки

def createRemoteFolder(folderName, parentID ):



    folderlist = (drive.ListFile  ({'q': "mimeType='application/vnd.google-apps.folder' and trashed=false"}).GetList())

    titlelist =  [x['title'] for x in folderlist]
    if folderName in titlelist:
        for item in folderlist:
            if item['title']==folderName:
                return item['id']
  
    file_metadata = {
        'title': folderName,
        'mimeType': 'application/vnd.google-apps.folder',
        'parents': [{"id": parentID}]  
    }
    file0 = drive.CreateFile(file_metadata)
    file0.Upload()
    return file0['id']
person rightsized    schedule 22.04.2021