2016-06-24 17 views
2

Das Problem, das ich erfahre, ist der Name der gespeicherten Datei. Die gespeicherte Datei wird nicht mit dem ursprünglichen/nicht komprimierten Dateinamen benannt. Stattdessen wird die gespeicherte Datei mit dem Archivnamen (mit der angehängten Erweiterung ".gz") benannt.Wie komprimiere ich eine große Datei in Python?

Erwartetes Ergebnis:
file.txt.gz {Archivname}
.... datei.txt {gespeicherte Dateiname}

Tatsächliches Ergebnis:
file.txt.gz {Archivname}
.... file.txt.gz {gespeicherte Dateiname}

durch die gzip Dokumentation Reading (https://docs.python.org/2.7/library/gzip.html) Beispielcode:

import gzip 
import shutil 
with open('file.txt', 'rb') as f_in, gzip.open('file.txt.gz', 'wb') as f_out: 
    shutil.copyfileobj(f_in, f_out) 

Wie bekomme ich das Archiv, um die Datei mit dem Namen "file.txt" statt "file.txt.gz" zu speichern?

+0

So können Sie die komprimierte Datei in 'file.txt' speichern? d.h. Überschreiben der vorhandenen Datei? – oxalorg

+0

Ich * glaube * das OP versucht, 'Datei.txt' in ihrer '.gz' Datei, und sie wollen, dass der' file.txt' Name der Name der Datei innerhalb der '.gz' Datei ist, aber sie bekommen eine' file.txt.gz' Datei, die enthält eine 'file.txt.gz'. –

+2

Aber jetzt, dass ich mich umschaue, glaube nicht, dass gzip ein echtes Archivformat ist, nur eine Dateikomprimierung -_- –

Antwort

-1

Sie unterscheiden zwischen 'gespeicherter Dateiname' und 'Archivname', aber für die gzip-Komprimierung ist dies die falsche Denkweise, da gzip kein Archivformat ist, sondern nur ein Komprimierungsprotokoll.

Wenn Sie eine 'gzip' Datei speichern, merkt sie sich nicht (unbedingt) den ursprünglichen Dateinamen. Es gibt nur den komprimierten Inhalt der Originaldatei, den Sie beliebig benennen können. Es gibt eine Konvention, um denselben Namen wie die Originaldatei zu erhalten, aber mit ".gz" angehängt. Die „gzip“ und „gunzip“ Dienstprogramme auf Unix-Systemen wird dies übernehmen, wenn Sie nur einen Dateinamen angeben:

gzip foo.txt 
# now foo.txt has been deleted, and foo.txt.gz exists 
gunzip foo.txt.gz 
# now you have foo.txt back, and foo.txt.gz has been deleted. 

Wenn Sie foo.txt.gz umbenennen, um bar.txt.gz und dann gunzip, werden Sie Get 'Goo.txt', wenn Sie Unix gunzip verwenden (aber andere Dienstprogramme könnten etwas anderes tun).

Sie können jedoch gzip und gunzip im Stream-Modus verwenden, in diesem Fall wissen sie nichts über Dateinamen - gzip ist wirklich über die Komprimierung und kümmert sich nicht um Dateinamen.

(Bearbeiten: gzip kann einen Dateinamen speichern, aber in einigen Fällen kann es nicht (wenn es keine ursprüngliche "Datei", nur Daten), und ob dies verwendet wird oder nicht, wenn Dekomprimierung ist völlig optional).

+1

Ich denke das ist falsch. Der Dateiname wird höchstwahrscheinlich in der in Wikipedia erwähnten gzip-Dateikopfzeile gespeichert. Versuchen Sie tatsächlich, eine Gzip-Datei umzubenennen und dekomprimieren Sie sie dann - Sie erhalten die Datei mit dem ursprünglichen Namen wie zuvor zurück. Oder zumindest bekomme ich es mit der Software, die ich installiert habe, zurück. – brezniczky

+0

@brezniczky ist korrekt mit einer Änderung, der "unkomprimierte Name" wird von dem Dateinamen abgeleitet, der mit 'gzip.open' verwendet wird. Wenn Sie die Datei 'foo.txt.gz' öffnen, lautet der unkomprimierte Name in der Kopfzeile' foo.txt', obwohl die Quelldatei 'bar.txt' genannt wird. Informationen zur Logik finden Sie in der [gzip module source] (https://github.com/python/cpython/blob/master/Lib/gzip.py#L229). –

+0

Sie haben recht, ich habe nicht bemerkt, dass gzip tatsächlich einen ursprünglichen Dateinamen speichert. Unix gunzip verwendet dies nicht beim Dekomprimieren, es sei denn, Sie übergeben "-N", was nicht der Standard ist, also kann man sich nicht darauf verlassen. Python-Module können etwas anderes tun, aber im Allgemeinen sollte gzip als Datenkomprimierungsformat und nicht als Archivformat betrachtet werden. – spookylukey

1

Sie müssen gzip.GzipFile() verwenden; Die Kurzschrift gzip.open() wird nicht tun, was Sie wollen.

Quoth the doc:

Wenn fileobj nicht None ist, das Dateiname Argument nur in den gzip Datei-Header enthalten sein verwendet, der die ursprünglichen Dateinamen der unkomprimierten Datei enthalten kann . Es wird standardmäßig der Dateiname fileobj, wenn erkennbar; Andernfalls wird standardmäßig die leere Zeichenfolge verwendet. In diesem Fall ist der ursprüngliche Dateiname nicht in der Kopfzeile enthalten.

Versuchen Sie folgendes:

import gzip 
import shutil 
with open('file.txt', 'rb') as f_in: 
    with open('file.txt.gz', 'wb') as f_out: 
     with gzip.GzipFile('file.txt', 'wb', fileobj=f_out) as f_out: 
      shutil.copyfileobj(f_in, f_out)