Seite 1 von 1

Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 16:08
von api
Hallo,

ich möchte gerne einige Dateien per "gzip" komprimieren. Dazu habe ich zur Zeit folgenden Code:

Code: Alles auswählen

for FileToCompress in glob.glob(options.filepattern):
     
    print "-" * 30
    print "File (%s) will be compressed..." % FileToCompress
    if FileToCompress.endswith('gz'): continue
    if os.path.isfile(FileToCompress):
      CompressedFile = FileToCompress + '.gz'
      
      f_in = open(FileToCompress, 'rb')
      f_out = gzip.open(CompressedFile, 'wb')
      f_out.writelines(f_in)
      f_out.close()
      f_in.close()
      print "File (%s) compressed" % CompressedFile
      if os.path.exists(CompressedFile): os.remove(FileToCompress)
      
      
    else:
      print "This is not a file: %s" % FileToCompress
Meine Fragen hierzu:
1. Das kann man doch bestimmt etwas mehr python-like schreiben, oder?
2. Wie kann ich den Timestamp einer Datei beibehalten? Zur Zeit wird der mit der aktuellen Zeit überschrieben..

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 16:37
von nomnom
Ja, da kann man was besser machen. ;)
  • Wenn du Dateien öffnen willst, solltest du das „with“-Statement benutzen.

    Code: Alles auswählen

    with open(filename, modes) as f:
        # f ist das Dateiobjekt und wird automatisch geschlossen
  • Hat zwar nichts mit dem Stil zu tun, allerdings ist es komisch, wenn zwar ausgegeben wird, dass „bla.gz“ komprimiert wird, in Wirklichkeit aber ausgelassen wird.
  • Man kann mit str.format ein bestimmtes Format für einen String vorgeben, zum Beispiel:

    Code: Alles auswählen

    compressed_file = '{}.gz'.format(file_to_compress)
  • Ansonsten gibt es noch PEP-8

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 17:11
von api
@nomnom: Danke für deine Ausführungen. Da kann ich ja das ja schon etwas schicker gestalten..

Kannst du mir auch sagen, wie ich den Timestamp einer Datei erhalten kann. Speziell interessiert mich die "Modifikationszeit"?

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 17:19
von api
@nomnom: Ich habe das mal versucht anzuwenden...

Code: Alles auswählen

     with open(FileToCompress, 'rb') as f_in:
        with gzip.open(CompressedFile, 'wb') as f_out:
           f_out.writelines(f_in)
Das funktioniert nicht ganz, weil...
ERROR: <type 'exceptions.AttributeError'> / GzipFile instance has no attribute '__exit__'

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 17:43
von Hyperion
Naja, das ``gzip.GZzipFile`` scheint das Kontext Manager Protokoll nicht zu unterstützen. Insofern musst Du das wie gehabt formulieren.

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 17:58
von nomnom
Hyperion hat geschrieben:Naja, das ``gzip.GZzipFile`` scheint das Kontext Manager Protokoll nicht zu unterstützen. Insofern musst Du das wie gehabt formulieren.
Oder man steigt auf Python ≥ 3.1 um, wenn man es kann und will …

Re: Komprimieren mit 'gzip'

Verfasst: Donnerstag 16. Februar 2012, 18:10
von BlackJack
Oder man verwendet `contextlib.closing()`.

Es ist so übrigens nicht besonders robust, weil Binärdateien eigentlich keine Zeilen kennen, und je nach Dateiinhalt und -grösse das auf diese Weise den Arbeitsspeicher sprengen kann. Das `shutil`-Modul bietet hier Funktionen, die sich zum kopieren von Binärdaten besser eignen.