2017-05-09 3 views
0

J'ai un ensemble de dossiers (appelés * .pages), que je veux compresser dans leurs fichiers .zip individuels, par exemple. "example1.pages" dans "example1.pages.zip", "example2.pages" dans "example2.pages.zip", etc. Je souhaite également inclure le contenu des dossiers individuels .pages.Comment compresser de manière récursive plusieurs dossiers en tant que fichiers .zip individuels?

Actuellement, le script zippe tous les fichiers .pages dans un seul fichier avec des répertoires imbriqués.

Je ne sais pas comment procéder, et je crois qu'il me manque quelque chose lors de l'exécution des fonctions zipfile.

Toute aide sera très appréciée!

import os 
import zipfile 

start_path = "MY/DIRECTORY/HERE" 

def zipdir(ziph): 
    dir_count = 0 
    file_count = 0 
    for (path,dirs,files) in os.walk(start_path): 
     print('Directory: {:s}'.format(path)) 
     dir_count += 1 

     for file in dirs: 
      if file.endswith(".pages"): 
       print('\nAttempting to zip: \'{}\''.format(file)) 

       ziph.write(os.path.join(path, file)) 

       print('Done') 
       file_count += 1 

    print('\nProcessed {} files in {} directories.'.format(file_count,dir_count))  



if __name__ == '__main__': 
    zipf = zipfile.ZipFile("NAME/OF/INDIVIDUAL/ZIP/FILE.zip", 'w', zipfile.ZIP_DEFLATED) 
    zipdir(zipf) 
    zipf.close() 
+3

Si vous souhaitez opérer sur des fichiers, pourquoi relancez-vous les répertoires? – pvg

+1

Si vous voulez plusieurs fichiers zip ... alors créez-les dans la boucle. – tdelaney

+0

@pvg Je souhaite utiliser des dossiers portant le nom ".pages" – WhoTheDevil

Répondre

0

Vous ouvrez un seul fichier zip et y ajoutez tout. Si vous voulez un zip par fichier, vous devez créer des fichiers zip dans la boucle que vous scannez les fichiers.

import os 
import zipfile 

start_path = "MY/DIRECTORY/HERE" 
start_path = '.' 

def zipdir(start_path): 
    dir_count = 0 
    file_count = 0 
    for (path,dirs,files) in os.walk(start_path): 
     print('Directory: {:s}'.format(path)) 
     dir_count += 1 
     for file in files: 
      if file.endswith(".pages"): 
       file_path = os.path.join(path, file) 
       print('\nAttempting to zip: \'{}\''.format(file_path)) 
       with zipfile.ZipFile(file_path + '.zip', 'w', zipfile.ZIP_DEFLATED) as ziph: 
        ziph.write(file_path, file) 
       print('Done') 
       file_count += 1 

    print('\nProcessed {} files in {} directories.'.format(file_count,dir_count)) 

if __name__ == '__main__': 
    zipdir(start_path)