Operatii cu fisiere
Un fisier reprezinta o locatie denumita de pe disk care este utilizata in stocarea persistenta a informtiei. Lucrul cu fisiere presupune urmatorii pasi: deschidere fisier, citire/scriere date, inchidere fisier după utilizare. Pentru a putea citi date dintr-un fisier sau scrie date intr-un fisier mai intai este necesara deschiderea acestuia.
f = open("studenti.txt")
La deschiderea unui fisier poate fi precizat modul in care urmeaza a fi utilizat fisierul: ‘r’ citire, ‘w’ scriere, ‘a’ adaugare. De exemplu, pentru deschiderea unui fisier in vederea realizarii de operatii de citire si scriere in mod text este necesara urmatoarea implementare.
f = open("studenti.txt", 'r+')
Mod | Semnificatie |
---|---|
‘r’ | deschide un fisier pentru citire (implicit) |
‘w’ | deschide un fisier pentru scriere; creeaza un nou fisier, daca nu exista, sau sterge continutul, daca exista |
‘x’ | deschide un fisier pentru crearea acestuia |
‘a’ | deschide un fisier pentru a adauga la finalul acestuia; creeaza un nou fisier, daca acesta nu exista |
‘t’ | deschide fisierul in mod text (implicit) |
‘b’ | deschide fisierul in mod binar |
‘+’ | deschide un fisier pentru actualizare (citire si scriere) |
Pentru a preciza codarea pentru setul de caractere, se poate utiliza un al treilea argument in functia open().
f = open("studenti.txt", mode = 'r', encoding = 'utf-8')
Se recomanda inchiderea fisierelor dupa utilizare pentru a elibera resursele ocupate de catre acestea. Inchiderea unui fisier, dupa utilizare, se realizeaza prin intermediul metodei close().
f.close()
Daca apare o exceptie la realizarea unor operatii cu fisierul deschis, acesta nu este inchis. O modalitatea mai eficienta de utilizare a unui fisier presupune deschiderea acestuia prin intermediul instructiunii with. In acest caz, apelarea metodei close() pentru fisierul deschis se realizeaza automat.
>>> with open('studenti.txt', 'r+', encoding = 'utf-8') as f: ... print(f.readline(), end = '') ... Irina Dumitrescu
Dupa inchiderea unui fisier, orice incercare de utilizarea a acestuia va esua.
>>> with open('studenti.txt', 'r+', encoding = 'utf-8') as f: ... for student in f.readlines(): ... print(student, end = '') ... Irina Dumitrescu Roxana Cornea Cornel Draghia >>> f.read() Traceback (most recent call last): File "", line 1, in ValueError: I/O operation on closed file.
Citire din fisiere
Operatia de citire de la nivelul unui fisier presupune deschiderea acestuia in mod citire. Citirea continutului fisierului se poate realiza prin apelul metodei read(), care citeste date de o anumita dimensiune si le returneaza ca si sir de caractere.
Fisierul studenti.txt cuprinde nume de studenti si este deschis prin intermediul functiei open() in mod citire. La nivelul fisierului sunt derulate doua operatii de citire prin intermediul metodelor de tip read(); mai intai sunt citite 5 caractere din fisier, dupa care se citeste restul fisierului, pana la sfarsitul acestuia.
>>> f = open('studenti.txt', 'r', encoding = 'utf-8') >>> print(f.read(5)) Irina >>> print(f.read()) Dumitrescu Roxana Cornea Cornel Draghia
Daca nu este precizata o valoare pentru dimensiune, intregul fisier este citit si returnat ca si sir de caractere. Pentru a modifica pozitia cursorului la nivelul fisierului citit se utilizeaza metoda seek(). Argumentul acesteia indica pozitia la care se realizeza deplasarea cursorului, 0 in cazul aducerii cursorului la inceputul fisierului.
f.seek(0)
Pentru a determina pozitia curenta a cursorului la nivelul fisierului se poate utiliza metoda tell().
>>> f = open('studenti.txt', 'r', encoding = 'utf-8') >>> f.read(5) 'Irina' >>> f.tell() 5 >>> f.read() ' Dumitrescu\nRoxana Cornea\nCornel Draghia\n' >>> f.tell() 49
Citirea continutului unui fisier se poate face si linie cu linie, utilizand o constructie for.
>>> f = open('studenti.txt', 'r', encoding = 'utf-8') >>> for linie in f: ... print(linie, end = '') ... Irina Dumitrescu Roxana Cornea Cornel Draghia
O alta modalitate de citire a unei linii dintr-un fisier o reprezinta metoda readline(). Aceasta citeste o linie din fisier si o returneaza ca si sir de caractere. Caracterul newline \n de la finalul unei linii este pastrat.
>>> f = open('studenti.txt', 'r', encoding = 'utf-8') >>> f.readline() 'Irina Dumitrescu\n' >>> f.readline() 'Roxana Cornea\n' >>> f.readline() 'Cornel Draghia\n' >>> f.readline() ''
Daca se doreste incarcarea liniilor dintr-un fisier intr-o lista, pot fi utilizate urmatoarele doua abordari: functia list() sau metoda readlines().
>>> f = open('studenti.txt', 'r') >>> for student in list(f): ... print(student, end = '') ... Irina Dumitrescu Roxana Cornea Cornel Draghia >>> f.close()
>>> with open('studenti.txt', 'r') as f: ... for student in f.readlines(): ... print(student, end = '') ... Irina Dumitrescu Roxana Cornea Cornel Draghia >>> f.close()
Scriere in fisiere
Pentru a scrie intr-un fisier acesta trebuie deschis in mod scriere ‘w’, adaugare ‘a’ sau creare fisier ‘x’. Daca se utilizeaza prima varianta ‘w’, exista posibilitatea de a suprascrie continutul actual al fisierului, daca fisierul exista.
Scrierea unui sir de caractere sau a unei secvente binare se face prin intermediul metodei write(). In mod text, metoda returneaza numarul de caractere scrise in fisier.
>>> f = open('studenti.txt', 'w') >>> f.write('Marian Popescu\n') 15 >>> f.close()
Caracterul de linie noua \n trebuie precizat la finalul unei linii scrise, daca se doreste diferentierea continutului pe linii.
>>> with open('studenti.txt', 'a') as f: ... f.write('Radu Voda\n') ... 10
>>> with open('studenti.txt', 'r') as f: ... for linie in f: ... print(linie, end = '') ... Marian Popescu Radu Voda
Modulul pickle
Serializarea reprezinta procesul de transformare a unui obiect intr-o secventa de octeti din care sa poata fi refacut ulterior. Procesul invers, de citire a unui obiect serializat pentru ai reface starea originala se numeste deserializare. Serializarea este utilizata pentru a implementa conceptul de persistenta a datelor.
Modulul pickle implementeaza protocoale binare pentru serializarea si deserializarea obiectelor Python. Poate transforma orice obiect Python intr-un sir de caractere (flux de date binar), proces denumit si pickling; procesul invers poarta numele de unpickling.
>>> import pickle >>> studenti = [('Marian', 7.21), ('Ioana', 8.34), ('Paul', 6.72), ('Zaya', 9.45)] >>> pickle.dump(studenti, open('studenti.p', 'wb'))
Salvarea unui obiect intr-un fisier se realizeaza prin intermediul metodei dump(), in timp ce incarcarea unui obiect dintr-un fisier se face cu metoda load().
>>> studenti = pickle.load(open('studenti.p', 'rb')) >>> studenti [('Marian', 7.21), ('Ioana', 8.34), ('Paul', 6.72), ('Zaya', 9.45)]