In deze les zullen we bestuderen hoe we Python kunnen gebruiken gzip module om te lezen en schrijven naar de gecomprimeerde bestanden in Python. De grootste functie die deze module ons biedt, is dat we gecomprimeerde bestanden kunnen behandelen als normale bestandsobjecten, wat ons de complexiteit van het beheren van bestanden en hun levenscyclus in onze code bespaart en ons in staat stelt ons te concentreren op de kernbedrijfslogica van het programma.De gzip module biedt ons bijna dezelfde functies als de GNU-programma's zoals: gunzip en gzip.
Gecomprimeerde bestanden schrijven met open()
We beginnen met een eenvoudig voorbeeld waarin we een gzip-bestand kunnen maken en er wat gegevens in kunnen schrijven. Hiervoor moeten we een bestand maken en het openen in de schrijfmodus zodat er gegevens in kunnen worden ingevoegd. Laten we een voorbeeldprogramma bekijken waarmee we gegevens in een gzip-bestand kunnen schrijven:
import gzipimport io
importeer os
output_file = 'linxhint_demo'.tekst.gz'
write_mode = 'wb'
met gzip.open(output_file, write_mode) als uitvoer:
met io.TextIOWrapper(output, encoding='utf-8') als codering:
coderen.write('We kunnen alles naar het bestand schrijven wat we willen.\n')
print(output_file),
'bevat', os.stat(output_file).st_size, 'bytes')
os.system('bestand -b --mime '.formaat(output_file))
Dit is wat we terugkrijgen met deze opdracht:
Schrijven naar zip-bestand
Als je nu naar de mappenstructuur kijkt waarin je dit script hebt uitgevoerd, zou er een nieuw bestand moeten zijn met de naam die we in ons programma hierboven hebben gegeven.
Meerdere regels naar een gecomprimeerd bestand schrijven
We kunnen ook meerdere regels of eigenlijk een willekeurig aantal regels in ons gzip-bestand schrijven op een vergelijkbare manier als in het vorige voorbeeld. Om dit voorbeeld anders te maken, zullen we ook gebruik maken van de itertools-module. Laten we eens kijken naar het voorbeeldprogramma:
import gzipimport io
importeer os
itertools importeren
output_file = 'linxhint_demo'.tekst.gz'
write_mode = 'wb'
met gzip.open(output_file, write_mode) als uitvoer:
met io.TextIOWrapper(output, encoding='utf-8') als enc:
enc.schrijflijnen(
itertools.repeat('LinuxHint, dezelfde regel herhalen!.\n', 10)
)
os.system('gzcat linxhint_demo'.tekst.gz')
Laten we de uitvoer voor deze opdracht bekijken:
Meerdere regels schrijven
Gecomprimeerde gegevens lezen
We kunnen ook het gecomprimeerde bestand lezen dat we in het laatste voorbeeld hebben gemaakt met behulp van de gzip-module met een heel eenvoudige aanroep naar Open functie:
import gzipimport io
importeer os
file_name = 'linxhint_demo.tekst.gz'
file_mode = 'rb'
met gzip.open(bestandsnaam, bestandsmodus) als invoerbestand:
met io.TextIOWrapper(input_file, encoding='utf-8') als dec:
afdrukken (december).lezen())
Dit is wat we terugkrijgen met deze opdracht:
Een gzip-bestand lezen
Streams lezen
Omdat tekstbestanden erg groot kunnen zijn, is het slim om deze bestanden in een stream te openen in plaats van het volledige bestand in een enkel object te laden, dat veel systeemgeheugen in beslag neemt en in sommige gevallen zelfs het proces kan veroorzaken volledig crashen. Laten we eens kijken naar een voorbeeldprogramma dat het gegeven gecomprimeerde bestand in een stream leest:
import gzipvan io import BytesIO
import binascii
mode_write = 'wb'
mode_read = 'rb'
non_compressed = b'Herhaalde regel x keer.\n' * 8
print('Niet-gecomprimeerde gegevens:', len(niet_gecomprimeerd))
print(niet_gecomprimeerd)
buf = BytesIO()
met gzip.GzipFile(mode=mode_write, fileobj=buf) als bestand:
het dossier.schrijven (niet_gecomprimeerd)
gecomprimeerd = buf.haalwaarde()
print('Gecomprimeerde gegevens:', len(gecomprimeerd))
print(binascii .).hexlify (gecomprimeerd))
in_buffer = BytesIO (gecomprimeerd)
met gzip.GzipFile(mode=mode_read, fileobj=in_buffer) als bestand:
read_data = bestand.lezen(len(niet_gecomprimeerd))
print('\nOpnieuw lezen:', len(read_data))
print(read_data)
Laten we de uitvoer voor deze opdracht bekijken:
Gzip-bestand lezen in een stream
Hoewel het programma een beetje lang was, hebben we eigenlijk gewoon Python-modules gebruikt om het bestand te openen en de inhoud naar de console te streamen met een gebufferd lezerobject.
Conclusie
In deze les hebben we gekeken hoe we de Python gzip-module kunnen gebruiken om bestanden in Python te comprimeren en te decomprimeren. De grootste functie die deze bibliotheek ons biedt, is dat we gecomprimeerde bestanden kunnen behandelen als normale bestandsobjecten.
Lees hier meer op Python gebaseerde berichten.