HOWTO · Python
Lesen Sie die gzip-Datei in Python
Dieses Tutorial hebt die Bedeutung des Komprimierens einer Datei hervor und zeigt, wie Sie mit gzip in Python komprimieren und dekomprimieren.
Auf dieser Seite
Verwenden Sie Pythons gzip-Modul aus der Standardbibliothek, um eine .gz-Datei zu lesen, ohne sie vorher zu entpacken. Öffnen Sie sie mit gzip.open() im Binärmodus, um Bytes zu erhalten, oder im Textmodus mit einer expliziten Kodierung, um Zeichenketten zu erhalten. Die folgenden Beispiele zeigen außerdem, wie Sie gzip-Dateien erstellen, Daten anhängen und Dateien entpacken.
Eine gzip-Datei in Python lesen
Eine gzip-Datei enthält komprimierte Daten im gzip-Format. gzip.open() stellt ihren Inhalt als dateiähnliches Objekt bereit. So können Sie alle Daten auf einmal lesen oder sie Zeile für Zeile verarbeiten. Das folgende Beispiel erstellt eine kleine gzip-Datei und liest ihren Inhalt als UTF-8-Text ein. Da das Programm auch die Eingabedatei erzeugt, ist das Beispiel in sich geschlossen.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import gzip
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as directory:
path = Path(directory) / "notes.txt.gz"
with gzip.open(path, "wt", encoding="utf-8") as compressed:
compressed.write("Python makes gzip files easy to read.\n")
with gzip.open(path, "rt", encoding="utf-8") as compressed:
print(compressed.read(), end="")
Binär- oder Textmodus auswählen
Verwenden Sie rb, wenn der komprimierte Inhalt aus Bytes besteht, etwa bei einem Bild oder einem anderen Binärformat. Beim Durchlaufen eines binären gzip-Datenstroms erhalten Sie Byte-Zeichenfolgen. Verwenden Sie rt, wenn der Inhalt Text darstellt, und geben Sie die Zeichenkodierung explizit an, damit Python die Bytes einheitlich dekodiert. Die entsprechenden Modi von gzip.open() zum Schreiben sind wb für Bytes und wt für Text. Ein Textdatenstrom nimmt Zeichenketten entgegen, ein binärer Datenstrom Bytes.
Bei großen Textdateien sollten Sie den Textdatenstrom durchlaufen, statt den gesamten Inhalt in den Arbeitsspeicher zu laden: for line in compressed:. Der Kontextmanager schließt den gzip-Datenstrom auch dann, wenn die Verarbeitung vorzeitig endet. Durch Komprimierung lassen sich bei geeigneten Daten Speicherbedarf und Übertragungsgröße reduzieren; Komprimierung und Dekomprimierung benötigen jedoch Rechenzeit. Wie viel Platz gespart wird, hängt von den Daten ab.
Eine gzip-Datei in Python schreiben
Öffnen Sie das Ziel mit wt, um Text zu schreiben, oder mit wb, um Bytes zu schreiben. Der Modus w erstellt einen neuen gzip-Datenstrom und ersetzt ein vorhandenes Ziel. Dieses Beispiel erstellt sowohl den Quelltext als auch die komprimierte Ausgabe und liest anschließend das Ergebnis ein, um zu zeigen, dass der Schreibvorgang funktioniert:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import gzip
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as directory:
path = Path(directory) / "report.txt.gz"
with gzip.open(path, "wt", encoding="utf-8") as compressed:
compressed.write("Daily report\n")
with gzip.open(path, "rt", encoding="utf-8") as compressed:
print(compressed.read(), end="")
Daten an eine gzip-Datei anhängen
Verwenden Sie at, um Text anzuhängen, oder ab, um Bytes anzuhängen. Verwenden Sie nicht wb, wenn der vorhandene Inhalt erhalten bleiben soll: Der Schreibmodus beginnt einen neuen gzip-Datenstrom. Beim Anhängen kann ein weiteres gzip-Mitglied zur Datei hinzukommen. gzip-Leseprogramme können die verketteten Mitglieder als einen logischen Datenstrom lesen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import gzip
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as directory:
path = Path(directory) / "log.txt.gz"
with gzip.open(path, "wt", encoding="utf-8") as compressed:
compressed.write("first entry\n")
with gzip.open(path, "at", encoding="utf-8") as compressed:
compressed.write("second entry\n")
with gzip.open(path, "rt", encoding="utf-8") as compressed:
print(compressed.read(), end="")
Eine gzip-Datei in Python entpacken
Um eine normale, unkomprimierte Datei zu erstellen, öffnen Sie die gzip-Quelldatei zum Lesen und das Ziel zum Schreiben. Kopieren Sie anschließend den Inhalt von der Quelle ins Ziel. Die Reihenfolge ist wichtig: Der gzip-Datenstrom ist die Eingabe, die normale Datei die Ausgabe. Der Binärmodus eignet sich für Text- und Nichttextinhalte und vermeidet, dass Bytes dekodiert oder verändert werden.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import gzip
import shutil
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as directory:
source = Path(directory) / "archive.txt.gz"
destination = Path(directory) / "archive.txt"
with gzip.open(source, "wb") as compressed:
compressed.write(b"Recovered contents\n")
with gzip.open(source, "rb") as compressed:
with destination.open("wb") as output:
shutil.copyfileobj(compressed, output)
print(destination.read_text(encoding="utf-8"), end="")
Wählen Sie den Textmodus, wenn Sie dekodierte Zeichenketten benötigen und die Kodierung der Datei kennen. Wählen Sie den Binärmodus, wenn Sie die ursprünglichen Bytes benötigen oder Nichttextdaten verarbeiten. Verwenden Sie wt oder wb, um eine komprimierte Datei zu erstellen, und at oder ab, um Daten anzuhängen. Beim Entpacken lesen Sie aus der gzip-Datei und schreiben den Inhalt in eine normale Datei.