28 votes

Comment compresser le contenu d'un dossier à l'aide de python (version 2.5)?

Une fois que j'ai tous les fichiers dont j'ai besoin dans un dossier particulier, je voudrais que mon script python ferme le contenu du dossier. Est-ce possible? Et comment pourrais-je m'y prendre? Un point dans la bonne direction (c'est-à-dire un lien avec un exemple) ou un exemple que je peux voir serait extrêmement utile. Merci d'avance.

42voto

jb. Points 4932

Sur python 2.7, vous pouvez utiliser: shutil.make_archive (base_name, format [, root_dir [, base_dir [, verbose [, dry_run [, owner [, group [, logger]]]]]]]) .

nom_archive nom de l'archive sans extension

format format de l'archive

répertoire root_dit à compresser.

Par exemple

  shutil.make_archive(target_file, format="bztar", root_dir=compress_me)    
 

32voto

J.F. Sebastian Points 102961

La version adaptée du script est:

 #!/usr/bin/env python
from __future__ import with_statement
from contextlib import closing
from zipfile import ZipFile, ZIP_DEFLATED
import os

def zipdir(basedir, archivename):
    assert os.path.isdir(basedir)
    with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z:
        for root, dirs, files in os.walk(basedir):
            #NOTE: ignore empty directories
            for fn in files:
                absfn = os.path.join(root, fn)
                zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path
                z.write(absfn, zfn)

if __name__ == '__main__':
    import sys
    basedir = sys.argv[1]
    archivename = sys.argv[2]
    zipdir(basedir, archivename)
 

Exemple:

 C:\zipdir> python -mzipdir c:\tmp\test test.zip
 

Il crée une archive 'C:\zipdir\test.zip' avec le contenu du répertoire 'c:\tmp\test' .

5voto

Kozyarchuk Points 4613

Voici une version récursive

 def zipfolder(path, relname, archive):
    paths = os.listdir(path)
    for p in paths:
        p1 = os.path.join(path, p) 
        p2 = os.path.join(relname, p)
        if os.path.isdir(p1): 
            zipfolder(p1, p2, archive)
        else:
            archive.write(p1, p2) 

def create_zip(path, relname, archname):
    archive = zipfile.ZipFile(archname, "w", zipfile.ZIP_DEFLATED)
    if os.path.isdir(path):
        zipfolder(path, relname, archive)
    else:
        archive.write(path, relname)
    archive.close()
 

3voto

kgiannakakis Points 62727

Utilisez le module zipfile:

 import zipfile

compressedFile = zipfile.ZipFile(FILENAME,"a", zipfile.ZIP_DEFLATED)
compressedFile.write(existing_file_name, archived_name)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X