Das Python-Zipfile-Modul scheint meine Dateien nicht zu komprimieren

72

Ich habe eine kleine Helferfunktion gemacht:

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()  

Das Problem ist, dass alle meine Dateien NICHT KOMPRIMIERT werden! Die Dateien haben die gleiche Größe und effektiv wird nur die Erweiterung in ".zip" geändert (in diesem Fall von ".xls").

Ich verwende Python 2.5 unter WinXP SP2.

Ramy
quelle

Antworten:

148

Dies liegt daran, ZipFiledass Sie die Komprimierungsmethode angeben müssen. Wenn Sie es nicht angeben, wird die Komprimierungsmethode angenommen zipfile.ZIP_STORED, bei der nur die Dateien gespeichert werden, ohne sie zu komprimieren. Sie müssen die zu verwendende Methode angeben zipfile.ZIP_DEFLATED. zlibDazu muss das Modul installiert sein ( normalerweise wird es standardmäßig installiert).

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()  
Chinmay Kanchi
quelle
36
Was für ein schrecklicher Standard! Warum?!
gabe
9
Weil das zlibModul nicht immer verfügbar ist, insbesondere in Sandbox-Installationen.
Chinmay Kanchi
6
Ich bin auf das gleiche Problem mit Zip-Dateien gestoßen. Ich muss zugeben, dass mein Fehler darin bestand, die Dokumentation nicht zu lesen, bevor ich Beispielcode aus Python-Dokumenten ausprobiert habe. Ich denke, der Beispielcode sollte den Parameter ZIP_DEFLATED enthalten, um ihn weniger verwirrend zu machen.
marcin_koss
13

Es gibt eine sehr einfache Möglichkeit, das zipFormat zu komprimieren .

Verwendung in der shutil.make_archiveBibliothek.

Zum Beispiel:

import shutil

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

Eine ausführlichere Dokumentation finden Sie unter: Hier

Gavriel Cohen
quelle
1
Vielen Dank für die Veröffentlichung. Auf diese Weise können Dateien sehr einfach archiviert werden, ohne dass das Zippen erforderlich ist. Es ist eine großartige Buchstütze für Prozesse, deren Daten für die Aufzeichnung gespeichert werden müssen. Ich habe damit ~ 10 Codezeilen auf 3 konsolidiert.
user3507825