Reputation: 21
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
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
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
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:
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')
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')
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