2.27. Čitanje i pisanje

Datoteke žive na disku; Python im pristupa putem open(), koji vraća objekt datoteke čije metode čitaju i pišu pripadajuće bajtove.

2.27.1. open i načini rada

Prvi argument je putanja; drugi je način rada – kratak niz koji govori Pythonu kako će se datoteka koristiti:

  • "r" – čitanje (zadano). Otvara postojeću datoteku za čitanje.

  • "w" – pisanje. Stvara novu datoteku ili skraćuje postojeću na praznu.

  • "a" – dodavanje. Otvara datoteku za pisanje na njezinom kraju bez skraćivanja.

  • "b" dodano bilo kojem od gore navedenih ("rb", "wb", "ab") – binarni način rada. Sadržaj datoteke je bytes umjesto str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Koristite upravitelja konteksta

Gornji obrazac propušta ručku datoteke ako bilo što između open() i close podigne iznimku. Rješenje je with naredba (vidi upravitelje konteksta):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Ovo je standardni oblik – pišite ga ovako svaki put.

2.27.3. Čitanje

Objekti datoteke podržavaju nekoliko stilova čitanja:

  • io.IOBase.read() – čita cijelu datoteku (ili N bajtova) i vraća je kao jedan niz (ili objekt tipa bytes).

  • io.IOBase.readline() – čita jedan redak, uključujući završni "\n".

  • Iteriranje datoteke izravno daje retke jedan po jedan, uz mnogo manju potrošnju memorije od čitanja cijele datoteke odjednom.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() uklanja završni znak novog retka prije ispisa kako izlaz ne bi bio dvostruko razmaknut.

2.27.4. Pisanje

Otvorite datoteku u načinu rada "w" i koristite io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() ne dodaje znak novog retka – piše točno one bajtove (ili znakove, u tekstualnom načinu) koje mu zadate.

2.27.5. Tekst naspram binarnog

Tekstualni način rada (zadano, "r" / "w" bez "b") dekodira dolazne bajtove u str pomoću zadanog kodiranja, i kodira odlazne str natrag u bajtove. Koristite ga za konfiguraciju, zapise, JSON – sve što jest tekst.

Binarni način rada ("rb" / "wb") preskače korak dekodiranja i vraća bytes. Koristite ga za slike, struct-pakirane zapise, mrežna snimanja – sve gdje je svaki bajt bitan i datoteka nije ljudski čitljiva.

2.27.6. Popisivanje i uklanjanje datoteka

Modul os izlaže operacije datotečnog sustava koje nisu na samom objektu datoteke:

import os

for name in os.listdir("/"):
    print(name)

Uhvatite OSError oko ovih kada datoteka ili direktorij možda nisu prisutni – operacija je jedno od uobičajenih mjesta gdje se iznimke pojavljuju u stvarnim skriptama.