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 tip bytes în loc de str.

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:

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.