53 votes

Ajout de dossiers à un fichier zip à l'aide de python

Je veux créer un fichier zip. Ajoutez un dossier au fichier zip, puis ajoutez un groupe de fichiers à ce dossier.

Je veux donc obtenir un fichier zip avec un seul dossier contenant des fichiers.

Je ne sais pas si c'est une mauvaise pratique d'avoir des dossiers dans des fichiers zip ou quelque chose comme ça mais google ne me donne rien sur le sujet.

J'ai commencé avec ça :

def addFolderToZip(myZipFile,folder):
    folder = folder.encode('ascii') #convert path to ascii for ZipFile Method
    for file in glob.glob(folder+"/*"):
            if os.path.isfile(file):
                print file
                myZipFile.write(file, os.path.basename(file), zipfile.ZIP_DEFLATED)
            elif os.path.isdir(file):
                addFolderToZip(myZipFile,file)

def createZipFile(filename,files,folders):
    curTime=strftime("__%Y_%m_%d", time.localtime())
    filename=filename+curTime;
    print filename
    zipFilename=utils.getFileName("files", filename+".zip")
    myZipFile = zipfile.ZipFile( zipFilename, "w" ) # Open the zip file for writing 
    for file in files:
        file = file.encode('ascii') #convert path to ascii for ZipFile Method
        if os.path.isfile(file):
            (filepath, filename) = os.path.split(file)
            myZipFile.write( file, filename, zipfile.ZIP_DEFLATED )

    for folder in  folders:   
        addFolderToZip(myZipFile,folder)  
    myZipFile.close()
    return (1,zipFilename)

(success,filename)=createZipFile(planName,files,folders);

Tiré de : http://mail.python.org/pipermail/python-list/2006-August/396166.html

Ce qui permet de se débarrasser de tous les dossiers et de placer tous les fichiers du dossier cible (et de ses sous-dossiers) dans un seul fichier zip. Je n'ai pas réussi à ajouter un dossier entier.

Si j'introduis le chemin d'accès à un dossier dans myZipFile.write, j'obtiens

IOError : [Errno 13] Permission refusée : '.. \packed\bin '

Toute aide est la bienvenue.

Question connexe : Comment zipper le contenu d'un dossier en utilisant python (version 2.5) ?

0voto

note Points 1

Merci beaucoup pour cette fonction utile ! Je l'ai trouvée très utile car je cherchais également de l'aide. Cependant, il serait peut-être utile de la modifier un peu de façon à ce que

basedir = os.path.dirname(dirpath) + '/'

serait

basedir = os.path.dirname(dirpath + '/')

Parce que j'ai constaté que si je veux compresser le dossier 'Exemple' qui se trouve dans le dossier ' C:\folder\path\notWanted\to\zip\Example ',

Je suis dans Windows :

dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example/'
dirname = 'C:\folder\path\notWanted\to\zip\Example\Example\Subfolder_etc'

Mais je suppose que votre code devrait donner

dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example\'
dirname = '\Subfolder_etc'

0voto

sohom Points 539
import os
import zipfile

zf = zipfile.ZipFile("file.zip", "w")
for file in os.listdir(os.curdir):
    if not file.endswith('.zip') and os.path.isfile(os.curdir+'/'+file):
        print file
        zf.write(file)
    elif os.path.isdir(os.curdir+'/'+file):
        print f
        for f in os.listdir(os.curdir+'/'+file):
            zf.write(file+'\\'+f)
zf.close()

-3voto

Lorsque vous voulez créer un dossier vide, vous pouvez le faire comme ceci :

    storage = api.Storage.open("empty_folder.zip","w")
    res = storage.open_resource("hannu//","w")
    storage.close()

Le dossier n'apparaît pas dans winextractor, mais quand vous l'extrayez, il apparaît.

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