2010-11-12 5 views
49

j'ai fait une petite fonction d'aide:python module zipfile ne semble pas compresser mes fichiers

import zipfile 

def main(archive_list=[],zfilename='default.zip'): 
    print zfilename 
    zout = zipfile.ZipFile(zfilename, "w") 
    for fname in archive_list: 
     print "writing: ", fname 
     zout.write(fname) 
    zout.close() 

if __name__ == '__main__': 
    main() 

Le problème est que tous mes fichiers ne sont pas en cours de compression! Les fichiers sont de la même taille et, en fait, juste l'extension est en train de changer en ".zip" (à partir de ".xls" dans ce cas). J'utilise python 2.5 sur winXP sp2.

Répondre

103

C'est parce que ZipFile vous oblige à spécifier la méthode de compression. Si vous ne le spécifiez pas, il suppose que la méthode de compression est zipfile.ZIP_STORED, qui stocke uniquement les fichiers sans les compresser. Vous devez spécifier la méthode à zipfile.ZIP_DEFLATED. Vous devrez avoir le module zlib installé pour cela (c'est habituellement installé par défaut).

import zipfile 

def main(archive_list=[],zfilename='default.zip'): 
    print zfilename 
    zout = zipfile.ZipFile(zfilename, "w", zipfile.ZIP_DEFLATED) # <--- this is the change you need to make 
    for fname in archive_list: 
     print "writing: ", fname 
     zout.write(fname) 
    zout.close() 

if __name__ == '__main__': 
    main() 
+15

ce défaut horrible! Pourquoi?! – gabe

+4

Parce que le module 'zlib' n'est pas toujours disponible, en particulier dans les installations en sandbox. –

+1

J'ai rencontré le même problème avec les fichiers zip. Je dois admettre que ma faute n'était pas de lire la documentation avant d'essayer un exemple de code de docs python. Je pense que le code d'exemple devrait inclure le paramètre ZIP_DEFLATED pour le rendre moins confus. –

5

Il existe un moyen très facile de compresser un format 'zip file',

Utilisation dans shutil.make_archive bibliothèque.

Par exemple:

import shutil 

shutil.make_archive(file_name, 'zip', file location after compression) 

peut voir une documentation plus détaillée à: https://docs.python.org/2/library/shutil.html#shutil.make_archive

Questions connexes