2009-04-05 6 views
1

Veuillez me dire pourquoi ce code échoue. Je suis nouveau et je ne comprends pas pourquoi ma mise en forme de mes arguments zip est incorrecte. Puisque je ne sais pas comment communiquer le mieux, je vais montrer le code, le message d'erreur, et ce que je crois se passe.Python 3: mise en forme correcte des arguments du module zip (newb)

#!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 

je reçois ce message d'erreur:

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"' 

Les deux tests d'impression avant zip_command est assigné me dire que les deux chaînes sont transmises à zipfile.ZipFile() correctement. La traceback me dit que je n'appelle pas zipfile.ZipFile() correctement. L'erreur dans __init__ me rend plus sûr de cela. Enfin, le problème semble être que ma chaîne de chemin a deux antislashs. Je ne peux pas comprendre pourquoi IOError le montre. J'ai utilisé this site pour savoir comment utiliser zipfile. zipfile est une classe, je l'importe au début du programme puis je l'utilise et sa méthode principale. Je passe le fichier que je voudrais écrire à zipfile.ZipFile('file to write', 'mode') et définir le programme pour ouvrir un ensemble d'objets à écrire. Ensuite, la commande écrit le fichier dans le dossier de destination avec une sous-méthode similaire, "".zipfile('files to write').

Où est-ce que je me trompe?

+0

Je ne sais pas exactement quels devis vous avez supprimés et lesquels vous n'avez pas; pouvez-vous éditer votre message pour montrer l'état actuel du code, et quelle erreur voyez-vous maintenant? – DNS

Répondre

3

On dirait que c'est parce que vous avez une paire de guillemets supplémentaire autour de votre chemin d'accès. Supprimez les guillemets doubles et voyez si cela fonctionne.

+0

À droite, j'ai pensé que je devais passer le chemin indiqué à la ligne de commande quand il utilisait un programme externe. J'ai supprimé les guillemets puisque tout est déjà une chaîne. J'ai enlevé les guillemets du if/else pour la chaîne cible. Je reçois toujours à peu près la même erreur. –

+0

Avez-vous essayé de les supprimer de la chaîne source également? –

1

Pour répondre à votre autre question: les doubles antislash sont là parce qu'ils sont escaped.