gzip ändert das Datum der Datei

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

Mittwoch 21. März 2012, 14:57

Hallo,

ich habe ein Problem beim Komprimieren von Dateien mittels "gzip". Das Komprimieren an sich funktioniert tadellos, aber die ursprüngliche Datei bekommt in dem "gezippten" Format den aktuellen Zeitstempel. Sie sollte aber den eigenen Zeitstempel beibehalten - schließlich möchte ich beim Auspacken dann die gleiche Datei wie vorher haben (also den gleichen Zeitstempel).

Mein Script zum Komprimieren sieht wie folgt aus:

Code: Alles auswählen

FileToCompress = "C:\tmp\test\test.ini"
CompressedFile = "C:\tmp\test\test.ini.gz"

with open(FileToCompress, 'rb') as f_in:
      
      f_out = gzip.open(CompressedFile, mode='wb')
      f_out.writelines(f_in)
      f_out.close()
Hat da jemand ne Idee wie ich das einbaue? Oder muss ich das ganz anders machen?
lunar

Mittwoch 21. März 2012, 17:45

@api: GZIP speichert keine Metadaten wie Zeitstempel. Es handelt sich nur und ausschließlich um ein Kompressionsalgorithmus, Metadaten wie Dateinamen, Zeitstempel oder Berechtigungen liegen völlig außerhalb seines Aufgabenbereichs.

Wenn Du die Metadaten ebenfalls speichern willst, dann darfst Du die Datei nicht einfach nur komprimieren, Du musst sie vielmehr korrekt archivieren. Dazu brauchst Du ein Archivformat, wie beispielsweise ZIP oder TAR.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Mittwoch 21. März 2012, 17:53

@lunar: Was meinst du mit Archivformat? Ich würde die Datei ja gerne als "*.gz" archivieren. Wie stelle ich das denn dann an? Meinst du eine Klasse wie "zipfile"?
lunar

Mittwoch 21. März 2012, 18:03

@api: Nochmal: ".gz" ist kein Archivformat. Eine ".gz"-Datei enthält nur die komprimierten Inhalt der ursprünglichen Datei und keine Informationen über deren Zeitstempel, Berechtigungen oder andere Metadaten. Du hast die Datei lediglich komprimiert, nicht aber „archiviert“.

Welche Formate Du verwenden kannst, um die Datei mitsamt ihrem Zeitstempel zu archivieren, habe ich Dir gesagt. Um diese Formate zu lesen oder zu schreiben, kannst Du die entsprechenden Module der Standardbibliothek ("zipfile" oder "tarfile") verwenden.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Donnerstag 22. März 2012, 10:57

@lunar: Ich habe ja verstanden, dass "*.gz" lediglich ein Komprimierformat ist. Aber das Verständnis dann "zipfile" oder "tarfile" zu verwenden hatte gefehlt.. :(

Aber ok. Jetzt hab ich es verstanden. :D

Danke dir.
Benutzeravatar
/me
User
Beiträge: 3246
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Donnerstag 22. März 2012, 11:36

api hat geschrieben:Aber ok. Jetzt hab ich es verstanden. :D
Das Problem ist, dass ein ZIP-File anscheinend auch nicht vollständig hilft. Ich bin eben bei Stackoverflow auf eine Frage zum Beibehalten des Erstellungsdatums beim Entpacken eines ZIP-Files gestoßen.
lunar

Donnerstag 22. März 2012, 13:00

@/me: Nun, im Gegensatz zu GZIP speichert ZIP die Zeitstempel wenigstens… wie man diese dann wieder extrahiert, ist eine andere Frage ;)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 25. März 2012, 09:56

Legt man eine neue Datei an, wird ihr automatisch ein Datum zugewiesen. Um dieses explizit zu setzen, kann man os.utime benutzen. So geht das gzip-Kommandozeilenprogramm ebenfalls vor.

Stefan
lunar

Montag 26. März 2012, 09:47

Ich muss zugeben, mich geirrt zu haben. gzip speichert den Zeitstempel tatsächlich:
The mtime argument is an optional numeric timestamp to be written to the stream when compressing. All gzip compressed streams are required to contain a timestamp. If omitted or None, the current time is used. This module ignores the timestamp when decompressing; however, some programs, such as gunzip, make use of it. The format of the timestamp is the same as that of the return value of time.time() and of the st_mtime attribute of the object returned by os.stat().
Allerdings ignoriert gzip den Zeitstempel bei der Dekompression, wie der markierten Stelle zu entnehmen ist.

Ich sollte die Dokumentation zur Abwechslung vielleicht selbst mal lesen, anstatt immer nur anderen dazu raten :oops: Tut mir leid.
Antworten