2.27. Citire și scriere¶
Fișierele se află pe disc; Python le accesează prin open(), care returnează un obiect fișier ale cărui metode citesc și scriu octeții subiacenți.
2.27.1. open și modurile¶
Primul argument este calea; al doilea este modul – un șir scurt care îi spune lui Python cum va fi folosit fișierul:
"r"– citire (implicit). Deschide un fișier existent pentru citire."w"– scriere. Creează un fișier nou sau trunchiază unul existent până la zero."a"– adăugare. Deschide un fișier pentru scriere la sfârșitul său, fără a-l trunchia."b"adăugat la oricare dintre cele de mai sus ("rb","wb","ab") – mod binar. Conținutul fișierului este de tipbytesîn loc destr.
f = open("notes.txt", "r")
text = f.read()
f.close()
2.27.2. Folosește un gestionar de context¶
Tiparul de mai sus pierde descriptorul fișierului dacă orice între open() și close generează o excepție. Soluția este instrucțiunea with (vezi gestionare de context):
with open("notes.txt") as f:
text = f.read()
# f is closed here, even if read() failed
Aceasta este forma standard – scrie-o așa de fiecare dată.
2.27.3. Citire¶
Obiectele fișier suportă mai multe stiluri de citire:
io.IOBase.read()– citește întregul fișier (sau N octeți) și îl returnează ca un singur șir (sau obiect bytes).io.IOBase.readline()– citește o linie, inclusiv caracterul final"\n".Iterarea directă a fișierului produce liniile una câte una, cu un consum de memorie mult mai mic decât citirea întregului fișier dintr-o dată.
with open("log.txt") as f:
for line in f:
print(line.rstrip())
str.rstrip() elimină caracterul de linie nouă final înainte de afișare, astfel încât rezultatul să nu fie distanțat dublu.
2.27.4. Scriere¶
Deschide fișierul în modul "w" și folosește io.IOBase.write():
with open("out.txt", "w") as f:
f.write("hello\n")
f.write("world\n")
io.IOBase.write() nu adaugă un caracter de linie nouă – scrie exact octeții (sau caracterele, în modul text) pe care i-i dai.
2.27.5. Text vs. binar¶
Modul text (implicit, "r" / "w" fără "b") decodifică octeții primiți în str folosind o codificare implicită și codifică str trimis înapoi în octeți. Folosește-l pentru configurare, jurnale, JSON – orice este text.
Modul binar ("rb" / "wb") sare peste etapa de decodificare și returnează bytes. Folosește-l pentru imagini, înregistrări împachetate cu struct, capturi de rețea – orice unde fiecare octet contează și fișierul nu este lizibil de către om.
2.27.6. Listarea și ștergerea fișierelor¶
Modulul os expune operațiile cu sistemul de fișiere care nu se află pe obiectul fișier în sine:
os.listdir()– returnează o listă de nume dintr-un director.os.remove()– șterge un fișier.os.rename()– redenumește un fișier.os.stat()– metadate ale fișierului (dimensiune, oră de modificare, …).os.mkdir()– creează un director nou.
import os
for name in os.listdir("/"):
print(name)
Capturează OSError în jurul acestora atunci când fișierul sau directorul ar putea să nu existe – operația este unul dintre locurile frecvente unde apar excepții în scripturile reale.