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ö on bytes eikä 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:

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ä.