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 jsoubytesnamístostr.
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:
os.listdir()– vrátí seznam názvů v adresáři.os.remove()– odstraní soubor.os.rename()– přejmenuje soubor.os.stat()– metadata souboru (velikost, čas úpravy, …).os.mkdir()– vytvoří nový adresář.
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.