2010-05-24 9 views
1

Je crée un fichier Zip à partir d'un dossier (et de sous-dossiers). cela fonctionne bien et crée un nouveau fichier .zip, mais j'ai un problème avec glob.glob. Il lit tous les fichiers à partir du dossier souhaité (dossier source) et écrit dans le nouveau fichier zip, mais le problème est qu'il est cependant l'ajout de sous-répertoires, mais pas l'ajout de fichiers à partir des sous-répertoires.Problème de création d'un fichier Zip avec glob.glob

Je donne à l'utilisateur une option pour sélectionner le nom de fichier et le chemin ainsi que le type de fichier aussi (Zip ou Tar). Je n'ai pas de problème lors de la création du fichier .tar.gz, mais lorsque l'utilisation crée un fichier .zip, ce problème se présente.

Voici mon code:

for name in (Source_Dir): 
    for name in glob.glob("/path/to/source/dir/*"): 
     myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) 

myZip.close() 

De plus, si j'utilise le code ci-dessous:

for dirpath, dirnames, filenames in os.walk(Source_Dir): 
     myZip.write(os.path.join(dirpath, filename) os.path.basename(filename))   

myZip.close() 

maintenant le 2e Code taks tous les fichiers même si l'intérieur du dossier/sous-dossiers, crée un nouveau fichier .zip et écrivez-le sans aucune structure d'annuaire. Il ne prend même pas de structure dir pour le dossier principal et écrit simplement tous les fichiers du répertoire principal ou du sous-répertoire dans ce fichier .zip.

Quelqu'un peut-il m'aider s'il vous plaît ou me suggérer. Je préférerais glob.glob plutôt que la 2ème option à utiliser.

Merci d'avance.

Cordialement, Akash

Répondre

1

Glob par la conception ne se développe pas dans les sous-répertoires. Il suit les règles de chemin de style UNIX et les extensions voir la documentation pour fnmatch pour plus d'informations. Si vous voulez accéder aux sous-répertoires, vous devez l'ajouter au chemin. Cet exemple va tout descendre à un niveau.

for name in (Source_Dir): 
    for name in glob.glob("/path/to/source/dir/*/*"): 
     myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) 

myZip.close() 

Doug Hellman a une excellente discussion here. Si vous n'utilisez pas les fonctions de pattern de glob (comme * .txt pour tous les fichiers texte ou * [0-9] .txt pour tous les fichiers texte qui ont un numéro avant l'extension) alors je pense que votre solution os.walk est meilleure