2.27. Lukeminen ja kirjoittaminen¶
Tiedostot sijaitsevat levyllä; Python tavoittaa ne open() -funktion kautta, joka palauttaa tiedosto-olion, jonka metodit lukevat ja kirjoittavat alla olevat tavut.
2.27.1. open ja tilat¶
Ensimmäinen argumentti on polku; toinen on tila – lyhyt merkkijono, joka kertoo Pythonille, miten tiedostoa käytetään:
"r"– luku (oletus). Avaa olemassa olevan tiedoston lukemista varten."w"– kirjoitus. Luo uuden tiedoston tai typistää olemassa olevan tyhjäksi."a"– lisäys. Avaa tiedoston kirjoittamista varten sen loppuun typistämättä sitä."b"lisättynä mihin tahansa yllä olevista ("rb","wb","ab") – binääritila. Tiedoston sisältö onbyteseikästr.
f = open("notes.txt", "r")
text = f.read()
f.close()
2.27.2. Käytä kontekstinhallintaa¶
Yllä oleva kaava vuotaa tiedostokahvan, jos jokin open() -funktion ja close -kutsun välillä nostaa poikkeuksen. Korjaus on with -lause (katso kontekstinhallinta):
with open("notes.txt") as f:
text = f.read()
# f is closed here, even if read() failed
Tämä on vakiomuoto – kirjoita se näin joka kerta.
2.27.3. Lukeminen¶
Tiedosto-oliot tukevat useita lukutapoja:
io.IOBase.read()– lukee koko tiedoston (tai N tavua) ja palauttaa sen yhtenä merkkijonona (tai tavuolioina).io.IOBase.readline()– lukee yhden rivin, mukaan lukien lopussa olevan"\n"-merkin.Tiedoston iterointi suoraan tuottaa rivit yksi kerrallaan, paljon pienemmällä muistinkäytöllä kuin koko tiedoston lukeminen kerralla.
with open("log.txt") as f:
for line in f:
print(line.rstrip())
str.rstrip() poistaa lopussa olevan rivinvaihdon ennen tulostamista, jotta tuloste ei ole kaksoisvälitetty.
2.27.4. Kirjoittaminen¶
Avaa tiedosto "w" -tilassa ja käytä io.IOBase.write() -metodia:
with open("out.txt", "w") as f:
f.write("hello\n")
f.write("world\n")
io.IOBase.write() ei lisää rivinvaihtoa – se kirjoittaa täsmälleen ne tavut (tai merkit tekstitilassa), jotka sille annat.
2.27.5. Teksti vs. binääri¶
Tekstitila (oletus, "r" / "w" ilman "b" -merkkiä) dekoodaa saapuvat tavut str -muotoon oletuskoodausta käyttäen ja enkoodaa lähtevän str -arvon takaisin tavuiksi. Käytä sitä asetuksiin, lokeihin, JSONiin – mihin tahansa, joka on tekstiä.
Binääritila ("rb" / "wb") ohittaa dekoodausvaiheen ja palauttaa bytes -arvon. Käytä sitä kuviin, struct-pakattuihin tietueisiin, verkkokaappauksiin – mihin tahansa, jossa jokainen tavu merkitsee eikä tiedosto ole ihmisluettava.
2.27.6. Tiedostojen listaaminen ja poistaminen¶
os -moduuli tarjoaa tiedostojärjestelmäoperaatiot, jotka eivät ole itse tiedosto-oliossa:
os.listdir()– palauttaa listan hakemiston nimistä.os.remove()– poistaa tiedoston.os.rename()– nimeää tiedoston uudelleen.os.stat()– tiedoston metatiedot (koko, muokkausaika, …).os.mkdir()– luo uuden hakemiston.
import os
for name in os.listdir("/"):
print(name)
Nappaa OSError näiden ympärillä, kun tiedostoa tai hakemistoa ei ehkä ole olemassa – operaatio on yksi yleisimmistä paikoista, joissa poikkeuksia ilmenee todellisissa skripteissä.