I den här lektionen kommer vi att studera hur vi kan använda Python gzip modul för att läsa och skriva i de komprimerade filerna i Python. Den största funktionen som den här modulen ger oss är att vi kan behandla komprimerade filer som vanliga filobjekt vilket sparar oss från komplexiteten i att hantera filer och deras livscykel i vår kod och låter oss fokusera på programmets kärnverksamhetslogik.De gzip -modulen ger oss nästan samma funktioner som GNU-programmen gunzip och gzip.
Skriva komprimerade filer med öppen ()
Vi börjar med ett grundläggande exempel där vi kan skapa en gzip-fil och skriva lite data i den. För detta måste vi skapa en fil och öppna den med skrivläge så att data kan infogas i den. Låt oss titta på ett exempelprogram med vilket vi kan skriva data i en gzip-fil:
importera gzipimportera io
importera os
output_file = 'linxhint_demo.Text.gz '
write_mode = 'wb'
med gzip.öppna (output_file, write_mode) som output:
med io.TextIOWrapper (output, kodning = 'utf-8') som kod:
koda.skriv ('Vi kan skriva vad vi vill till filen.\ n ')
skriv ut (utdatafil,
'innehåller', os.stat (utdatafil).st_size, 'bytes')
os.system ('file -b --mime '.format (utdatafil))
Här är vad vi får tillbaka med det här kommandot:
Skriver till zip-fil
Om du nu tittar på mappstrukturen där du körde det här skriptet, borde det finnas en ny fil med namnet på det vi gav i vårt program ovan.
Skriva flera rader i en komprimerad fil
Vi kan också skriva flera rader eller faktiskt valfritt antal rader i vår gzip-fil på ett mycket liknande sätt som vi gjorde i föregående exempel. För att göra detta exempel annorlunda kommer vi också att använda modulen itertools. Låt oss titta på exempelprogrammet:
importera gzipimportera io
importera os
importera verktyg
output_file = 'linxhint_demo.Text.gz '
write_mode = 'wb'
med gzip.öppna (output_file, write_mode) som output:
med io.TextIOWrapper (output, kodning = 'utf-8') som enc:
enc.skrivlinjer (
itverktyg.repeat ('LinuxHint, upprepar samma rad!.\ n ', 10)
)
os.system ('gzcat linxhint_demo.Text.gz ')
Låt oss se utdata för det här kommandot:
Skriva flera rader
Läser komprimerade data
Vi kan också läsa den komprimerade filen som vi skapade i det senaste exemplet med hjälp av gzip-modulen med ett mycket enkelt samtal till öppna fungera:
importera gzipimportera io
importera os
file_name = 'linxhint_demo.Text.gz '
file_mode = 'rb'
med gzip.öppna (filnamn, filnamn) som inmatningsfil:
med io.TextIOWrapper (input_file, kodning = 'utf-8') som dec:
skriva ut (dec.läsa())
Här är vad vi får tillbaka med det här kommandot:
Läser en gzip-fil
Läser strömmar
På grund av det faktum att textfiler kan vara mycket stora, är det smart att öppna dessa filer i en ström snarare än att ladda hela filen i ett enda objekt som upptar mycket systemminne och i vissa fall till och med kan orsaka processen att krascha helt. Låt oss titta på ett exempelprogram som läser den givna komprimerade filen i en ström:
importera gzipfrån io importera BytesIO
importera binascii
mode_write = 'wb'
mode_read = 'rb'
icke-komprimerad = b'Upprepad linje x gånger.\ n '* 8
skriv ut ('Icke komprimerad data:', len (icke_komprimerad))
skriva ut (icke-komprimerad)
buf = BytesIO ()
med gzip.GzipFile (mode = mode_write, fileobj = buf) som fil:
fil.skriv (icke-komprimerad)
komprimerad = buf.getvalue ()
skriv ut ('Komprimerad data:', len (komprimerad))
skriva ut (binascii.hexlify (komprimerad))
in_buffer = BytesIO (komprimerad)
med gzip.GzipFile (mode = mode_read, fileobj = in_buffer) som fil:
read_data = fil.läs (len (icke-komprimerad))
skriva ut ('\ nLäs igen:', len (read_data))
skriv ut (läsdata)
Låt oss se utdata för det här kommandot:
Läser gzip-fil i en ström
Även om programmet var lite långt använde vi faktiskt bara Python-moduler för att öppna filen och strömma innehållet vidare till konsolen med ett buffrat läsarobjekt.
Slutsats
I den här lektionen tittade vi på hur vi kan använda Python gzip-modul för att komprimera och dekomprimera filer i Python. Den största funktionen som detta bibliotek ger oss är att vi kan behandla komprimerade filer som vanliga filobjekt.
Läs mer Python-baserade inlägg här.