Fișiere binare
Fișierele binare, spre deosebire de cele text, stochează informația sub formă de seturi de octeți. Când deschidem un fișier binar pentru citire sau scriere, trebuie să ținem cont că este necesar să aplicăm modul "b" în combinație cu modul de scriere ("w") sau de citire ("r").
La citire, obținem fișierul sub formă de seturi de octeți, iar invers, la scriere, în metoda write() se transmite un set de octeți. De exemplu, să copiem un fișier:
FILENAME = "forest.png" # fișier pentru citire
NEWFILENAME = "forest_new.png" # fișier pentru scriere
image_data = [] # listă pentru stocarea datelor citite
# citim fișierul în lista image_data
with open(FILENAME, "rb") as file:
image_data = file.read()
# scriem octeții citiți anterior într-un fișier nou
with open(NEWFILENAME, "wb") as file:
file.write(image_data)
print(f"Fișierul {FILENAME} a fost copiat în {NEWFILENAME}")
Scriptul citește fișierul al cărui cale este stocată în variabila FILENAME. În acest caz, este vorba despre un fișier imagine "forest.png". Octeții citiți sunt plasați în lista image_data. Apoi, această listă este scrisă într-un fișier cu numele NEWFILENAME. Astfel, copiem conținutul unui fișier în altul.
Modulul pickle
Pentru lucrul cu fișiere binare, Python oferă și un modul încorporat special numit pickle, care simplifică lucrul cu fișierele binare. Acest modul oferă două metode principale:
- dump(obj, file): scrie obiectul obj într-un fișier binar file
- load(file): citește datele dintr-un fișier binar și le încarcă într-un obiect
Să presupunem că trebuie să salvăm valorile a două variabile:
import pickle
FILENAME = "user.dat"
name = "Tom"
age = 19
with open(FILENAME, "wb") as file:
pickle.dump(name, file)
pickle.dump(age, file)
with open(FILENAME, "rb") as file:
name = pickle.load(file)
age = pickle.load(file)
print("Nume:", name, "\tVârstă:", age)
Cu ajutorul funcției dump, se scriu secvențial două obiecte. Prin urmare, la citirea fișierului, putem citi aceste obiecte în aceeași ordine cu ajutorul funcției load. Ieșirea pe consolă a programului:
plaintext
Nume: Tom Vârstă: 19
În mod similar, putem salva și extrage din fișier seturi de obiecte:
import pickle
FILENAME = "users.dat"
users = [
["Tom", 28, True],
["Alice", 23, False],
["Bob", 34, False]
]
with open(FILENAME, "wb") as file:
pickle.dump(users, file)
with open(FILENAME, "rb") as file:
users_from_file = pickle.load(file)
for user in users_from_file:
print("Nume:", user[0], "\tVârstă:", user[1], "\tCăsătorit/Căsătorită:", user[2])
În funcție de obiectul pe care l-am scris cu funcția dump, același obiect va fi returnat de funcția load la citirea fișierului.
Ieșirea pe consolă:
Nume: Tom Vârstă: 28 Căsătorit/Căsătorită: True
Nume: Alice Vârstă: 23 Căsătorit/Căsătorită: False
Nume: Bob Vârstă: 34 Căsătorit/Căsătorită: False
Acest mod de lucru cu fișiere binare și modulul pickle simplifică foarte mult manipularea datelor complexe în Python, permițând stocarea și recuperarea acestora într-un mod eficient și ușor de utilizat.