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 jebytesumjestostr.
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:
os.listdir()– vraća listu imena u direktoriju.os.remove()– briše datoteku.os.rename()– preimenuje datoteku.os.stat()– metapodaci datoteke (veličina, vrijeme izmjene, …).os.mkdir()– stvara novi direktorij.
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.