tags:

views:

285

answers:

2

Please tell me why this code fails. I am new and I don't understand why my formatting of my zip arguments is incorrect. Since I am unsure how to communicate best so I will show the code, the error message, and what I believe is happening.

#!c:\python30
# Filename: backup_ver5.py

import os
import time
import zipfile


source = r'"C:\Documents and Settings\Benjamin Serrato\My Documents\python\backup_list"'

target_dir = r'C:\Documents and Settings\Benjamin Serrato\My Documents\python\backup_dir'

today = target_dir + os.sep + time.strftime('%Y%m%d') 

now = time.strftime('%H%M%S')

comment = input('Enter a comment --> ')

if len(comment) == 0:
    target = '"' + today + os.sep + now + '.zip' + '"'
else:
    target = '"' + today + os.sep + now + '_' + \
    comment.replace(' ', '_') + '.zip' + '"'

if not os.path.exists(today):
    os.mkdir(today)
    print('Successfully created directory', today)


print(target)
print(source)
zip_command = zipfile.ZipFile(target, 'w').write(source)

if os.system(zip_command) == 0:
    print('Successful backup to', target)
else:
    print('Backup FAILED')

    enter code here

I recieve this error message:

Enter a comment -->
"C:\Documents and Settings\Benjamin Serrato\My Documents\python\backup_dir\20090
405\134614.zip"
"C:\Documents and Settings\Benjamin Serrato\My Documents\python\backup_list"
Traceback (most recent call last):
  File "C:\Documents and Settings\Benjamin Serrato\My Documents\python\backup_ve
r5.py", line 32, in <module>
    zip_command = zipfile.ZipFile(target, 'w').write(source)
  File "c:\python30\lib\zipfile.py", line 683, in __init__
    self.fp = io.open(file, modeDict[mode])
  File "C:\Python30\lib\io.py", line 222, in open
    closefd)
  File "C:\Python30\lib\io.py", line 615, in __init__
    _fileio._FileIO.__init__(self, name, mode, closefd)
IOError: [Errno 22] Invalid argument: '"C:\\Documents and Settings\\Benjamin Ser
rato\\My Documents\\python\\backup_dir\\20090405\\134614.zip"'

The two print tests before zip_command is assigned tell me that the two strings are being passed to zipfile.ZipFile() correctly. The traceback tells me I am not calling zipfile.ZipFile() correctly. The error in __init__ makes me more sure of this. Last, the problem seems to be that I am causing my path string to have double backslashes. I can't follow why the IOError shows that.

I used this site to figure out how to use zipfile. zipfile is a class, I import it at the start of the program then I use it and its primary method. I pass the file I would like to write to zipfile.ZipFile('file to write', 'mode') and set the program to open an object set to be writable. Then the command writes the file to the destination folder with a sub-method like so, "".zipfile('files to write').

Where am I going wrong?

+3  A: 

Looks like it's because you have an extra pair of double quotes around your pathname. Remove the double quotes, and see if it works.

Brian Campbell
Right, I thought I needed to pass the quoted path to the command line when this was using an external program. I removed the quotes since everything is already a string. I removed the quotes from the if/else for the target string. I still receive roughly the same error.
Did you try removing them from the source string as well?
Brian Campbell
+1  A: 

To answer your other question: the double backslashes are there because they are escaped.

Stephan202