Mit gzip.compress() die Dateigröße reduzieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

Ich mochte gerne verschiedene Dateien komprimieren. Konkret z.B. ein jpg file mit 5.1 MB.
Ich kann das mit 'zipfle' und 'compression=zipfile.ZIP_DEFLATED' machen - das funktioniert gut. Aber mit gzip bekomme ich das nicht hin!?
Irgendwie steh ich da 'auf dem Schlauch'!?

Ich habe zwei Versuche:

Code: Alles auswählen

VERSUCH 1

import gzip
import shutil

sourcefile = 'assets/pic01.jpg'
targetfile = 'assets/picGZIP.jpg.gz'

with open(sourcefile, 'rb') as f_in:

    with gzip.open(targetfile, 'wb') as f_out:
      #  comp_file = gzip.compress(f_out, 9)
        shutil.copyfileobj(f_in, f_out)
        
        
        
        
VERSUCH 2:
    
 with open(sourcefile, 'rb') as f_in:
    with open(targetfile, 'wb') as f_out:
        with gzip.GzipFile(sourcefile, 'wb', fileobj=f_out, compresslevel=9) as f_out:
            shutil.copyfileobj(f_in, f_out)

Ich kann mit beider Versionen zwar gz archive erstellen, aber die Dateigröße bleibt unverändert. Wen ich versuche gzip.compress() (Versuch 1) mit dem Fileobjekt zu verwenden bekomme ich den Fehler:

Code: Alles auswählen

  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/gzip.py", line 276, in write
    data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'GzipFile'
Ok, ich offne das als Binary (rb)...
Wie mache ich das am sinnvollsten!? Ich weiss vorher nicht immer, was fur einen Dateityp ich offnen werde, daher dachte ich 'rb' ist ganz sinnvoll.
Verstehe ich das richtig und ich muss mein ganzes Fileobjekt jedesmal fur compress() erstmal in ein byte Objekt konvertieren!?

Oder weshalb funktioniert 'compresslevel=9' (Versuch 2) eigentlich nicht!? Es bleibt einfach ohne Wirkung!? Der gz file ist mit 5.1 MB genauso gross wie der sourcefile (pic01.jpg)!?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Der zweite Versuch ist zwar recht kompliziert geschrieben, funktioniert aber:

Code: Alles auswählen

with open(sourcefile, 'rb') as f_in:
    with gzip.open(targetfile, 'wb', compresslevel=9) as f_out:
        shutil.copyfileobj(f_in, f_out)
Und gzip.compress braucht, wie die Fehlermeldung auch sagt, direkt die Bytes und kein FileObjekt.
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

Sirius3 hat geschrieben: Sonntag 14. Juni 2020, 16:29 Der zweite Versuch ist zwar recht kompliziert geschrieben, funktioniert aber:

Code: Alles auswählen

with open(sourcefile, 'rb') as f_in:
    with gzip.open(targetfile, 'wb', compresslevel=9) as f_out:
        shutil.copyfileobj(f_in, f_out)
Und gzip.compress braucht, wie die Fehlermeldung auch sagt, direkt die Bytes und kein FileObjekt.
Ja, der funktioniert, das hatte ich ja auch schon geschrieben, aber das Problem ist, dass die Dateigröße unverändert bleibt. Ich mochte eben gerne auch dass der gz file am Ende kleiner ist als der input file. Und in dem Beispiel kann ich 'compresslevel' von 0 bis 9 verändern aber die Dateigröße des gz files bleibt unverändert genauso gross wie die des jpg files, denn ich versuche so zu komprimieren!?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Na, liegt das vielleicht daran, dass das jpg-File bereits komprimiert ist?
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

sparrow hat geschrieben: Sonntag 14. Juni 2020, 17:00 Na, liegt das vielleicht daran, dass das jpg-File bereits komprimiert ist?
haha, ich sagte ja bereits, dass ich wohl irgendwie 'auf dem Schlauch stehe...'..
das war wohl der Grund!
vielen Dank!!!
Antworten