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.
Réponses
Trop de publicités?
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)
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'
.
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()
kgiannakakis
Points
62727