Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using python to update a file on google drive

I have the following script to upload a file unto google drive, using python27. As it is now it will upload a new copy of the file, but I want the existing file updated/overwritten. I can't find help in the Google Drive API references and guides for python. Any suggestions?

from __future__ import print_function
import os

from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# Gain acces to google drive
SCOPES = 'https://www.googleapis.com/auth/drive.file'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store, flags) \
            if flags else tools.run(flow, store)
DRIVE = build('drive', 'v3', http=creds.authorize(Http()))

#The file that is being uploaded
FILES = (
    ('all-gm-keys.txt', 'application/vnd.google-apps.document'), #in google doc format 
)
#Where the file ends on google drive
for filename, mimeType in FILES:
    folder_id = '0B6V-MONTYPYTHONROCKS-lTcXc' #Not the real folder id
    metadata = {'name': filename,'parents': [ folder_id ] }
    if mimeType:
        metadata['mimeType'] = mimeType
    res = DRIVE.files().create(body=metadata, media_body=filename).execute()
    if res:
        print('Uploaded "%s" (%s)' % (filename, res['mimeType']))
like image 889
Erik Warming Avatar asked Nov 17 '16 10:11

Erik Warming


People also ask

Can you update a file in Google Drive?

Right-click the file and select Manage versions. Click Upload new version and select a file from your computer. When the new version is done uploading, click Close.


2 Answers

I think that you are looking for the update method. Here is a link to the documentation. There is an example on overwriting the file in python.

I think that using the official google client api instead of pure http requests should make your task easier.

like image 72
Thomas E. Avatar answered Nov 15 '22 23:11

Thomas E.


from apiclient import errors
from apiclient.http import MediaFileUpload
# ...

def update_file(service, file_id, new_title, new_description, new_mime_type,
                new_filename, new_revision):
  """Update an existing file's metadata and content.

  Args:
    service: Drive API service instance.
    file_id: ID of the file to update.
    new_title: New title for the file.
    new_description: New description for the file.
    new_mime_type: New MIME type for the file.
    new_filename: Filename of the new content to upload.
    new_revision: Whether or not to create a new revision for this file.
  Returns:
    Updated file metadata if successful, None otherwise.
  """
  try:
    # First retrieve the file from the API.
    file = service.files().get(fileId=file_id).execute()

    # File's new metadata.
    file['title'] = new_title
    file['description'] = new_description
    file['mimeType'] = new_mime_type

    # File's new content.
    media_body = MediaFileUpload(
        new_filename, mimetype=new_mime_type, resumable=True)

    # Send the request to the API.
    updated_file = service.files().update(
        fileId=file_id,
        body=file,
        newRevision=new_revision,
        media_body=media_body).execute()
    return updated_file
  except errors.HttpError, error:
    print 'An error occurred: %s' % error
    return None

Link the example: https://developers.google.com/drive/api/v2/reference/files/update#examples

like image 42
Danna Luciana Carrillo Perez Avatar answered Nov 15 '22 23:11

Danna Luciana Carrillo Perez