Liron London
Liron London

Reputation: 21

How to delete a local file after uploading it to Google Drive?

I need a python function that uploads a file to Google Drive and then deletes it from the file system. When trying to use the following code, I get an error when trying to delete the file:

def upload():
    file_metadata = {
        'name': 'thankyou.jpg',
        'mimeType': 'image/jpeg'}
    media = MediaFileUpload('thankyou.jpg')
    myfile = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    os.remove('thankyou.jpg')

The upload completes successfully, but I can't delete the file locally after the upload. The error I get is:

PermissionError: [WinError 32] The process cannot access the file 
because it is being used by another process: 'thankyou.jpg'

what should I do in order for the file to be deleted?

Upvotes: 1

Views: 1321

Answers (3)

Sanch
Sanch

Reputation: 407

I would do something like this:

Using:

 gfile.content.close()
upload_file_list = ['photo1.jpg', 'photo2.jpg']
for upload_file in upload_file_list:
    gfile = drive.CreateFile({'parents': [{'id': 'Google folder ID'}]}) #add the folder ID here
    # Read file and set it as the content of this instance.
    gfile.SetContentFile(upload_file)
    gfile.Upload() # Upload the file
gfile.content.close() #close the file

Upvotes: 0

mdavis6890
mdavis6890

Reputation: 89

I just ran into this myself in Windows 10, and finally came up with this solution: set the variable used to store your MediaFileUpload object to None:

    media = MediaFileUpload(folder+file.name, resumable=True)
logging.info("{} - {} {}MB uploading...".format(datetime.datetime.now().strftime("%H:%M:%S"), file.name, file_size))
try:
    service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    logging.info(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" uploaded")
    media = None
except Exception as err:
    logging.warning(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" failed to upload:\nType: {}".format(type(err)))

try:
    os.remove(folder+file.name)
    logging.info(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" deleted.")
except PermissionError as err:
    logging.error("{} - Failed to delete local file. Looks like a permision error: {}".format(datetime.datetime.now().strftime("%H:%M:%S"), err))
except Exception as err:
    logging.warning("{} - Failed to delete local file: {}".format(datetime.datetime.now().strftime("%H:%M:%S"), err))

Upvotes: 3

Axiumin_
Axiumin_

Reputation: 2145

I've tried it with one of my projects, and you can just add a return function of anything (i just used file id), and then after using upload(), just do os.remove('somethingidk.jpg').

For example:

Before:

main.py

                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')

file-uploader.py

def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    os.remove('output.avi')

After:

main.py

                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')

                os.remove('output.avi')

file-uploader.py

def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    return file.get('id')

Edit

Or...

Just do this:

def SendFileIncomplete(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    return ("File ID: %s" % file.get('id'))

def SendFile(file_path, file_name, mime):
    SendFileIncomplete(file_path, file_name, mime)
    os.remove(file_name)

What this is is just using a function inside of a function. You would then use SendFile when uploading.

Upvotes: 1

Related Questions