Modulul shelve
Pentru lucrul cu fișiere binare în Python, poate fi utilizat și un alt modul - shelve. Acesta salvează obiecte într-un fișier asociindu-le cu o anumită cheie. Ulterior, obiectele salvate pot fi extrase din fișier folosind acea cheie. Procesul de lucru cu datele prin intermediul modulului shelve este similar cu lucrul cu dicționare, care de asemenea folosesc chei pentru salvarea și extragerea obiectelor.
Pentru a deschide un fișier, modulul shelve folosește funcția open():
open(calea_către_fișier[, flag="c"[, protocol=None[, writeback=False]]])
Unde parametrul flag poate avea următoarele valori:
- c: fișierul se deschide pentru citire și scriere (valoare implicită). Dacă fișierul nu există, acesta este creat
- r: fișierul se deschide doar pentru citire.
- w: fișierul se deschide pentru scriere.
- n: fișierul se deschide pentru scriere. Dacă fișierul nu există, acesta este creat. Dacă fișierul există, acesta este rescris.
Pentru a închide conexiunea la fișier, se apelează metoda close():
import shelve
d = shelve.open(filename)
d.close()
Alternativ, fișierul poate fi deschis cu ajutorul operatorului with. Să salvăm și să citim în/din fișier câteva obiecte:
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open(FILENAME) as states:
print(states["London"])
print(states["Madrid"])
Scrierea datelor implică setarea unei valori pentru o anumită cheie:
states["London"] = "Great Britain"
Citirea din fișier este echivalentă cu obținerea valorii prin intermediul unei chei:
print(states["London"])
Ca și în cazul dicționarelor, cheile sunt valori de tip șir. Ieșirea pe consolă a programului:
Great Britain
Spain
Citirea datelor
La citirea datelor, dacă cheia solicitată nu există, se generează o excepție. În acest caz, înainte de a obține valoarea, putem verifica existența cheii folosind operatorul in:
with shelve.open(FILENAME) as states:
key = "Brussels"
if key in states:
print(states[key])
De asemenea, putem folosi metoda get(). Primul parametru al metodei este cheia prin care dorim să obținem valoarea, iar al doilea parametru este valoarea implicită, care se returnează dacă cheia nu este găsită.
with shelve.open(FILENAME) as states:
state = states.get("Brussels", "Undefined")
print(state)
Folosind o buclă for, putem parcurge toate valorile din fișier:
with shelve.open(FILENAME) as states:
for key in states:
print(key," - ", states[key])
Metoda keys() returnează toate cheile din fișier, iar metoda values() returnează toate valorile:
with shelve.open(FILENAME) as states:
for city in states.keys():
print(city, end=" ") # London Paris Berlin Madrid
print()
for country in states.values():
print(country, end=" ") # Great Britain France Germany Spain
O altă metodă, items(), returnează un set de tuple. Fiecare tuplu conține o cheie și valoarea corespunzătoare acesteia.
with shelve.open(FILENAME) as states:
for state in states.items():
print(state)
Ieșirea pe consolă:
("London", "Great Britain")
("Paris", "France")
("Berlin", "Germany")
("Madrid", "Spain")
Actualizarea datelor
Pentru a modifica datele, este suficient să atribuim o nouă valoare unei chei existente, iar pentru a adăuga date, definim o nouă cheie:
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open(FILENAME) as states:
states["London"] = "United Kingdom"
states["Brussels"] = "Belgium"
for key in states:
print(key, " - ", states[key])
Ștergerea datelor
Pentru a șterge un element și a obține simultan valoarea acestuia, putem folosi funcția pop(), care primește cheia elementului și o valoare implicită dacă cheia nu este găsită:
with shelve.open(FILENAME) as states:
state = states.pop("London", "NotFound")
print(state)
De asemenea, pentru ștergere se poate utiliza operatorul del:
with shelve.open(FILENAME) as states:
del states["Madrid"] # ștergem obiectul cu cheia Madrid
Pentru a șterge toate elementele, se poate folosi metoda clear():
with shelve.open(FILENAME) as states:
states.clear()