12.3 Pickle
Problem: Da li ja u fajlu mogu samo da čuvam stringove, ili postoji i način da sačuvam bilo kakav objekat koji koristim u svom programu? Treba mi, želim da sačuvam na primer, listu sa najboljim rezultatima.
Rešenje: Jedno od mogućih rešenja je korišćenje Pythonovog standardnog modula koji se zove pickle. Pomoću njega možš da sačuvaš bilo kakav objekat u fajl i zatim, iz istog tog fajla ga učitati i koristiti kad zatreba. Ovo se drugačije naziva perzistentno čuvanje – tj čuvanje podataka za stalno.
Da krenemo na primer i da pokažemo kako se radi (i ovaj put, interaktivni prompt pokreni iz nekog „poznatog“ direktorijuma, slično kao što si uradio i u prošlom poglavlju kada sam ti objašnjavao fajlove).
>>> import pickle
>>> čuvam_u = 'programdata.data'
>>> najboljirezultati = [(150, 'Miloš'), (120, 'Jelena'), (110, 'Kozica Prasić'), (60, 'ja'), (30, 'ti')]
>>>
U ovom trenutku, jednostavno sam kreirao dve promenljive, jednu u kojoj čuvam ime fajla koji želim da koristim, i drugu u kojoj čuvam listu sačinjenu od tupli najboljih rezultata, na primer, u nekoj igri. Pre svega toga sam importovao modul pickle koji mi je potreban u radu.
Da bi memorisao neki objekat u nekom fajlu, prvo moram da "otvorim" taj fajl (da kreiram fajl objekt) pomoću funkcije open(), pri čemu moram voditi računa o njenim parametrima! Zbog specifičnosti objekata, i samog modula pickle, parametri su: 'b' – otvara fajl u binarnom režimu i 'w' -fajl otvoren za upisivanje:
>>> fajl = open(čuvam_u, 'wb')
>>>
Da bih u ovom fajlu sačuvao nešto moram pozvati funkciju dump() koja je deo pickle modula. Ovaj proces (čuvanje objekata u fajlu) se naziva pickling.
>>> pickle.dump(najboljirezultati, fajl)
>>> fajl.close()
>>>
Brišemo najbolje rezultate da nam ne zauzimaju mesto u memoriji računara:
>>> del najboljirezultati
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', 'fajl', 'pickle', 'čuvam_u']
>>>
Učitavanje ide suprotno. Otvaramo fajl u 'rb' binarnom režimu za čitanje, a zatim, mi moramo „učitati“ objekat pomoću load() funkcije koja je deo pickle modula, a koja će da nam vrati naš objekat. Ovaj proces (čitanje iz fajla) se naziva unpickling:
>>> f = open(čuvam_u, 'rb')
>>> top_rez = pickle.load(f)
>>> for i in top_rez:
... a, b = i
... print('{} ima {} poena.'.format(b, a))
...
Miloš ima 150 poena.
Jelena ima 120 poena.
Kozica Prasić ima 110 poena.
ja ima 60 poena.
ti ima 30 poena.
>>> f.close()
>>>
Za prikaz rezultata koristio sam for petlju, a takđe i „otpakivanje“ tupli. Prouči dobro šta se desilo i kako se desilo, videćeš, nije teško.
12.2 Fajlovi | Indeks | 12.4 Unicode |
0 Коментари
Pokažite nam šta mislite o ovome!