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.