Komprimieren mit 'gzip'

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
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

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..
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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"?
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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__'
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, das ``gzip.GZzipFile`` scheint das Kontext Manager Protokoll nicht zu unterstützen. Insofern musst Du das wie gehabt formulieren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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 …
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.
Antworten