V této lekci se budeme věnovat tomu, jak můžeme Python využít gzip modul pro čtení a zápis do komprimovaných souborů v Pythonu. Největší vlastností, kterou nám tento modul poskytuje, je to, že s komprimovanými soubory můžeme zacházet jako s běžnými objekty File, což nám ušetří složitost správy souborů a jejich životního cyklu v našem kódu a umožní nám soustředit se na základní obchodní logiku programu.The gzip modul nám poskytuje téměř stejné funkce jako programy GNU gunzip a gzip.
Zápis komprimovaných souborů pomocí open ()
Začneme základním příkladem, kde můžeme vytvořit soubor gzip a zapsat do něj nějaká data. K tomu musíme vytvořit soubor a otevřít jej v režimu zápisu, aby do něj bylo možné vložit data. Podívejme se na ukázkový program, pomocí kterého můžeme zapisovat data do souboru gzip:
importovat gzipimportovat io
import os
output_file = 'linxhint_demo.txt.gz '
write_mode = 'wb'
s gzip.otevřít (output_file, write_mode) jako výstup:
s io.TextIOWrapper (výstup, kódování = 'utf-8') jako kódování:
zakódovat.write ('Do souboru můžeme zapsat cokoli chceme.\ n ')
print (output_file,
'contains', os.stat (output_file).st_size, 'bytes')
os.system ('file -b --mime '.format (output_file))
S tímto příkazem se vrátíme:
Zápis do souboru zip
Pokud se nyní podíváte na strukturu složek, kde jste tento skript provedli, měl by existovat nový soubor s názvem, který jsme poskytli výše v našem programu.
Zápis více řádků do komprimovaného souboru
Můžeme také napsat více řádků nebo vlastně libovolný počet řádků v našem souboru gzip velmi podobným způsobem, jako jsme to udělali v předchozím příkladu. Abychom tento příklad odlišili, využijeme také modul itertools. Podívejme se na ukázkový program:
importovat gzipimportovat io
import os
import itertools
output_file = 'linxhint_demo.txt.gz '
write_mode = 'wb'
s gzip.otevřít (output_file, write_mode) jako výstup:
s io.TextIOWrapper (výstup, kódování = 'utf-8') jako enc:
příloha.spisy (
itertools.repeat ('LinuxHint, opakování stejného řádku!.\ n ', 10)
)
os.system ('gzcat linxhint_demo.txt.gz ')
Podívejme se na výstup tohoto příkazu:
Psaní více řádků
Čtení komprimovaných dat
Můžeme také číst komprimovaný soubor, který jsme vytvořili v posledním příkladu pomocí modulu gzip s velmi jednoduchým voláním otevřeno funkce:
importovat gzipimportovat io
import os
file_name = 'linxhint_demo.txt.gz '
file_mode = 'rb'
s gzip.otevřít (file_name, file_mode) jako input_file:
s io.TextIOWrapper (input_file, encoding = 'utf-8') jako prosinec:
tisk (pros.číst())
S tímto příkazem se vrátíme:
Čtení souboru gzip
Čtení streamů
Vzhledem k tomu, že textové soubory mohou mít velmi velkou velikost, je chytré tyto soubory otevřít v proudu, než načíst celý soubor do jediného objektu, který zabírá hodně paměti systému a v některých případech může dokonce způsobit proces úplně havarovat. Podívejme se na ukázkový program, který přečte daný komprimovaný soubor v proudu:
importovat gzipz io importu BytesIO
importovat binascii
mode_write = 'wb'
mode_read = 'rb'
non_compressed = b'Opakovaný řádek x krát.\ n '* 8
print ('Non compressed Data:', len (non_compressed))
tisk (bez_komprimace)
buf = BytesIO ()
s gzip.GzipFile (mode = mode_write, fileobj = buf) jako soubor:
soubor.write (non_compressed)
stlačený = buf.getvalue ()
print ('Compressed Data:', len (compressed))
tisk (binascii.hexlify (komprimovaný))
in_buffer = BytesIO (komprimovaný)
s gzip.GzipFile (mode = mode_read, fileobj = in_buffer) jako soubor:
read_data = soubor.read (len (non_compressed))
print ('\ nČtení znovu:', len (read_data))
print (read_data)
Podívejme se na výstup tohoto příkazu:
Čtení souboru gzip ve streamu
Ačkoli byl program trochu dlouhý, ve skutečnosti jsme právě použili moduly Pythonu, které otevírají soubor a streamují obsah na konzolu pomocí čtecího objektu ve vyrovnávací paměti.
Závěr
V této lekci jsme se podívali na to, jak můžeme využít modul gzip Pythonu ke kompresi a dekompresi souborů v Pythonu. Největší funkcí, kterou nám tato knihovna poskytuje, je to, že s komprimovanými soubory můžeme zacházet jako s běžnými objekty File.
Přečtěte si více příspěvků založených na Pythonu zde.