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.

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.