Šajā nodarbībā mēs pētīsim, kā mēs varam izmantot Python gzip modulis, lai lasītu un ierakstītu Python saspiestajos failos. Lielākā iezīme, ko mums nodrošina šis modulis, ir tā, ka saspiestos failus varam apstrādāt kā parastus failu objektus, kas ietaupa mūs no failu pārvaldības sarežģītības un to dzīves cikla mūsu kodā un ļauj mums koncentrēties uz programmas pamata biznesa loģiku.The gzip modulis nodrošina mums gandrīz tādas pašas funkcijas kā GNU programmas, piemēram, gunzip un gzip.
Saspiestu failu rakstīšana ar atvērtu ()
Mēs sāksim ar pamata piemēru, kur mēs varam izveidot gzip failu un tajā ierakstīt dažus datus. Lai to izdarītu, mums ir jāizveido fails un jāatver tas ar rakstīšanas režīmu, lai tajā varētu ievietot datus. Apskatīsim programmas paraugu, ar kuru mēs varam ierakstīt datus gzip failā:
importēt gzipimporta io
importēt os
output_file = 'linxhint_demo.txt.gz '
write_mode = 'wb'
ar gzip.atvērt (izejas_fails, rakstīšanas_režīms) kā izvadi:
ar io.TextIOWrapper (izvade, kodējums = 'utf-8') kā kodējums:
kodēt.write ('Mēs varam ierakstīt failā visu, ko vēlamies.\ n ')
drukāt (izejas_fails,
'satur', os.stat (output_file).st_size, 'baiti')
os.sistēma ('file -b --mime '.formāts (izvades_fails))
Lūk, ko mēs atgūsim ar šo komandu:
Rakstīšana ZIP failā
Ja tagad apskatīsit mapju struktūru, kurā izpildījāt šo skriptu, vajadzētu būt jaunam failam ar nosaukumu, ko mēs norādījām iepriekš mūsu programmā.
Vairāku rindiņu ierakstīšana saspiestā failā
Mēs varam arī ierakstīt vairākas rindiņas vai faktiski jebkuru rindu skaitu mūsu gzip failā ļoti līdzīgā veidā, kā mēs to darījām iepriekšējā piemērā. Lai padarītu šo piemēru atšķirīgu, mēs izmantosim arī itertools moduli. Apskatīsim programmas paraugu:
importēt gzipimporta io
importēt os
importēt itertoolus
output_file = 'linxhint_demo.txt.gz '
write_mode = 'wb'
ar gzip.atvērts (izejas_fails, rakstīšanas_raksts) kā izvads:
ar io.TextIOWrapper (izvade, kodējums = 'utf-8') kā enc:
enc.rakstu līnijas (
itertools.atkārtot ('LinuxHint, atkārtojot to pašu rindu!.\ n ', 10)
)
os.sistēma ('gzcat linxhint_demo.txt.gz ')
Apskatīsim šīs komandas izvadi:
Vairāku rindiņu rakstīšana
Saspiestu datu lasīšana
Mēs varam arī izlasīt saspiesto failu, kuru izveidojām pēdējā piemērā, izmantojot moduli gzip ar ļoti vienkāršu zvanu uz atvērts funkcija:
importēt gzipimporta io
importēt os
faila_nosaukums = 'linxhint_demo.txt.gz '
file_mode = 'rb'
ar gzip.atvērt (faila_nosaukums, faila_raksts) kā ievades_fails:
ar io.TextIOWrapper (ievades_fails, kodējums = 'utf-8') kā dec:
izdruka (dec.lasīt ())
Lūk, ko mēs atgūsim ar šo komandu:
Gzip faila lasīšana
Straumju lasīšana
Sakarā ar to, ka teksta faili var būt ļoti lieli, ir gudri atvērt šos failus straumē, nevis ielādēt visu failu vienā objektā, kas aizņem daudz sistēmas atmiņas un dažos gadījumos var pat izraisīt procesu pilnībā avarēt. Apskatīsim programmas paraugu, kas straumē nolasa doto saspiesto failu:
importēt gzipno io importa BytesIO
importēt binascii
mode_write = 'wb'
mode_read = 'rb'
non_compressed = b'Atkārtota rinda x reizes.\ n '* 8
drukāt ('Nesaspiesti dati:', len (nesaspiesti))
drukāt (nesaspiesta)
buf = BytesIO ()
ar gzip.GzipFile (mode = mode_write, fileobj = buf) kā fails:
failu.rakstīt (nesaspiests)
saspiests = buf.getvalue ()
drukāt ('Saspiesti dati:', len (saspiests))
drukāt (binascii.hexlify (saspiests))
in_buffer = BytesIO (saspiests)
ar gzip.GzipFile (mode = mode_read, fileobj = in_buffer) kā fails:
read_data = fails.lasīt (len (non_compressed))
print ('\ nLasot vēlreiz:', len (read_data))
izdrukāt (lasīt_datus)
Apskatīsim šīs komandas izvadi:
Gzip faila lasīšana straumē
Lai gan programma bija nedaudz gara, mēs faktiski vienkārši izmantojām Python moduļus, lai atvērtu failu un straumētu saturu uz konsoli ar buferētu lasītāja objektu.
Secinājums
Šajā nodarbībā mēs apskatījām, kā mēs varam izmantot Python gzip moduli, lai saspiestu un atspiestu failus Python. Lielākā iezīme, ko šī bibliotēka mums piedāvā, ir tā, ka saspiestos failus varam apstrādāt kā parastus failu objektus.
Lasiet vairāk uz Python balstītas ziņas šeit.