2.27. Čtení a zápis

Soubory leží na disku; Python se k nim dostává přes open(), které vrací souborový objekt, jehož metody čtou a zapisují podkladové byty.

2.27.1. open a režimy

Prvním argumentem je cesta; druhým je režim – krátký řetězec, který Pythonu říká, jak bude soubor použit:

  • "r" – čtení (výchozí). Otevře existující soubor pro čtení.

  • "w" – zápis. Vytvoří nový soubor nebo zkrátí existující na prázdný.

  • "a" – připojení. Otevře soubor pro zápis na jeho konci bez zkrácení.

  • "b" připojené k jakémukoli z výše uvedených ("rb", "wb", "ab") – binární režim. Obsahem souboru jsou bytes namísto str.

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

2.27.2. Použijte kontextový správce

Výše uvedený vzor způsobí únik souborového ukazatele, pokud cokoli mezi open() a close vyvolá výjimku. Řešením je příkaz with (viz kontextoví správci):

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

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

Toto je standardní forma – pište to takto pokaždé.

2.27.3. Čtení

Souborové objekty podporují několik stylů čtení:

  • io.IOBase.read() – přečte celý soubor (nebo N bytů) a vrátí jej jako jediný řetězec (nebo objekt bytes).

  • io.IOBase.readline() – přečte jeden řádek včetně koncového "\n".

  • Iterace souboru přímo poskytuje řádky po jednom, s mnohem menší spotřebou paměti než čtení celého souboru najednou.

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

str.rstrip() před tiskem odstraní koncový znak nového řádku, takže výstup nebude mít dvojité řádkování.

2.27.4. Zápis

Otevřete soubor v režimu "w" a použijte io.IOBase.write():

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

io.IOBase.write() nepřidává znak nového řádku – zapíše přesně ty byty (nebo znaky v textovém režimu), které mu dáte.

2.27.5. Text vs. binární data

Textový režim (výchozí, "r" / "w" bez "b") dekóduje příchozí byty na str pomocí výchozího kódování a kóduje odchozí str zpět na byty. Použijte jej pro konfiguraci, logy, JSON – cokoli, co je text.

Binární režim ("rb" / "wb") přeskakuje krok dekódování a vrací bytes. Použijte jej pro obrazy, záznamy zabalené pomocí struct, síťové zachytávky – cokoli, kde záleží na každém bytu a soubor není lidsky čitelný.

2.27.6. Výpis a odstraňování souborů

Modul os zpřístupňuje operace souborového systému, které nejsou na samotném souborovém objektu:

import os

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

Kolem nich zachytávejte OSError, když soubor nebo adresář nemusí existovat – tato operace je jedním z běžných míst, kde se v reálných skriptech objevují výjimky.