Seite 1 von 1

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

Verfasst: Sonntag 14. Juni 2020, 15:50
von Phraya
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)!?

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

Verfasst: Sonntag 14. Juni 2020, 16:29
von Sirius3
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.

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

Verfasst: Sonntag 14. Juni 2020, 16:55
von Phraya
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!?

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

Verfasst: Sonntag 14. Juni 2020, 17:00
von sparrow
Na, liegt das vielleicht daran, dass das jpg-File bereits komprimiert ist?

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

Verfasst: Sonntag 14. Juni 2020, 17:26
von Phraya
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!!!