Práce se soubory
Práce se soubory je důležitou součástí programování.
Data (objekty v paměti) se vypnutím aplikace ztratí (uvolní se z RAM). Abychom mohli s daty pracovat trvale, musíme je při ukončení uložit a při načtení znovu otevřít.

Zdroj obrázku: https://realpython.com/working-with-files-in-python/#pythons-with-open-as-pattern
Data můžeme ukládat do několika typů souborů:
- Textové soubory
- s plochou strukturou – např. txt, csv
- s hierarchií – např. xml, json
- Binární soubory – MP3, obrázky…
- Databáze – organizovaná kolekce dat
Otevírání souborů
Otevírání souborů v Pythonu je docela jednoduché, použijeme k tomu funkci open(). Ta má několik vstupních parametrů:
- Název souboru
- nezapomeňme uvést i příponu souboru
- Mód otevření souboru
- „r“ – (read) pouze pro čtení
- „w“ – (write) zápis (vytvoří nový soubor, existující přepíše)
- „a“ – (append) připisování do souboru (append)
- „b“ – (binary) binární mód (obrázky, zvukové soubory), můžeme kombinovat s „r“, „w“, „a“
- Znaková sada
- my budeme používat „utf-8“
Syntaxe je tedy open(„soubor.typ“, „mod“, encoding=“znakova_sada“).
Nejprve vytvoříme blok s with – díky tomu nemusíme soubor ručně zavírat – uzavře se automaticky). Následně pomocí as řekneme, do které proměnné uložíme instanci se souborem.
Syntaxe vypadá následovně:
with open("soubor.txt", "r", encoding="utf-8") as soubor
Čtení ze souboru
Při čtení ze souboru získáváme dat uložená v souboru. Nejprve si otevřeme soubor a vybereme mód pro čtení.
with open("soubor.txt", "r", encoding="utf-8") as soubor
Pro čtení můžeme využít několik funkcí:
- Funkce read() přečte celý obsah souboru jako jeden řetězec:
with open("soubor.txt", "r", encoding="utf-8") as soubor:
obsah = soubor.read()
print(obsah)
- Funkce readline() přečte jeden řádek souboru jako řetězec, opakovaným voláním se postupně dostáváme k dalším řádkům, pomocí .strip() odstraníme koncové znaky nového řádku:
with open("soubor.txt", "r", encoding="utf-8") as soubor:
radky = soubor.readlines()
for radek in radky:
print(radek.strip())
- Funkce readlines() načte všechny řádky a vrátí je jako seznam, jeden řádek představuje právě jeden prvek v tomto seznamu, pomocí .strip() odstraníme koncové znaky nového řádku:
with open("soubor.txt", "r", encoding="utf-8") as soubor:
for radek in soubor:
print(radek.strip())
Zápis do souboru
Při zápisu ukládáme nová data nebo přepisujeme existující obsah.
- Zápisem pomocí „w“ módu přepisujeme veškerý obsah souboru, pokud soubor neexistuje, Python jej automaticky vytvoří. Následně pomocí funkce .write() zapíšeme nový obsah souboru.
with open("soubor.txt", "w", encoding="utf-8") as soubor:
soubor.write("Toto je nový obsah souboru.")
- Zápisem pomocí „a“ módu zapisujeme na konec souboru (připojíme nový obsah), na rozdíl od „w“ zachováme obsah původního souboru. Pokud soubor neexistuje, Python jej automaticky vytvoří. Následně pomocí funkce .write() zapíšeme nový obsah souboru. Pomocí \n vložíme enter, abychom nevkládali nový řádek na stávající:
with open("soubor.txt", "a", encoding="utf-8") as soubor:
soubor.write("\nTento text bude připojen na konec souboru.")
Práce s binárními soubory
Používáme pro čtení nebo zápis binárních dat – například obrázky.
Otevíráme pomocí módu „rb“ pro čtení nebo „wb“ pro zápis.
with open('obrazek.jpg', 'rb') as f:
obsah = f.read()
Další módy pro pokročilé zápisy
- „r+“ mód – otevře soubor pro čtení i zápis, ale zachovává existující obsah (přepisuje od začátku).
Nejprve načteme existující obsah, následně pomocí .seek(0) vrátíme ukazatel na začátek a přepisujeme počáteční data.
with open("soubor.txt", "r+", encoding="utf-8") as soubor:
obsah = soubor.read()
print("Původní obsah souboru:")
print(obsah)
soubor.seek(0)
soubor.write("Nový začátek souboru.\n")
- „w+“ mód – kombinace zápisu a čtení, přičemž existující obsah je vymazán. Nejdříve zapíšeme do souboru, následně se přesuneme ukazatelem .seek(0) na začátek a přečteme obsah, který jsme právě zapsali.
with open("soubor.txt", "w+", encoding="utf-8") as soubor:
soubor.write("Tento text je nový obsah souboru.\n")
soubor.seek(0)
obsah = soubor.read()
print("Aktuální obsah souboru po zápisu:")
print(obsah)
- „a+“ mód – kombinace připojování a čtení. Využijeme, pokud chceme přidávat data na konec a zároveň mít přístup k přečtení celého obsahu.
Přidáme na konec nějaký text, vrátíme pomocí .seek(0) ukazatel na začátek a přečteme celý obsah vč. přidaného textu.
with open("soubor.txt", "a+", encoding="utf-8") as soubor:
soubor.write("Tento text byl přidán na konec souboru.\n")
soubor.seek(0)
obsah = soubor.read()
print("Obsah souboru po připojení nového textu:")
print(obsah)
Modul os
Umožňuje pracovat se soubory a adresáři na úrovni operačního systému. Díky tomuto modulu můžeme zjišťovat informace o souborech, manipulovat se soubory a složkami nebo nastavovat prostředí.
Kontrola existence souboru či složky
Pokud pracujeme se soubory a složkami, někdy potřebujeme ověřit, zda daný soubor či adresář skutečně existuje, než s nimi začneme manipulovat. Funkce os.path.exists() vrací hodnotu True, pokud daná cesta existuje, jinak False.
import os
if os.path.exists('soubor.txt'):
print('Soubor existuje')
else:
print('Soubor neexistuje')
Vytváření složek
Pokud potřebujeme vytvořit novou složku, použijeme funkci os.mkdir(). Pokud potřebujeme vytvořit složky i s potřebnou strukturou nadřazených adresářů, použijeme os.mkdirs().
os.mkdir('nova_slozka')
os.makedirs("c:/test/mesos")
Odstranění souborů a složek
Když se nám soubor nebo složka nehodí pro práci (např. pro testování), můžeme je odstranit. Funkcí os.remove() smažeme soubor, funkcí os.rmdir() prázdnou složku.
os.remove('soubor.txt')
os.rmdir('slozka')
Aktuální pracovní složka
Funkcí os.getcwd() můžeme zjistit, kde se právě nacházíme. Python totiž při manipulaci se soubory hledá soubory relativně k této pracovní složce.
print(os.getcwd())
Pokud potřebujeme změnit pracovní složku na jinou, použijeme funkci os.chdir().
os.chdir('/cesta/k/jine/slozce')
Získání obsahu složky
Pro zjištění, jaké soubory a složky jsou v daném adresáři, použijeme funkci os.listdir(), která vrací seznam všech položek v daném adresáři
obsah = os.listdir('.')
print(obsah)
Manipulace s cestami
Správné spojování částí cesty k souborům a složkám je důležité, protože struktura cest může být na různých systémech odlišná (například Windows vs. Linux). Funkce os.path.join() se stará o správné spojování částí cesty. Pokud bychom využili obyčejné řetězce, nemusel by program správně fungovat v různých systémech.
cesta = os.path.join('adresar', 'soubor.txt')
print(cesta)
Výsledek bude adresar/soubor.txt na Unix systémech, nebo adresar\soubor.txt na Windows
Systémové prostředí a proměnné
Každý operační systém má nastavené tzv. proměnné prostředí, které uchovávají různé informace – cestu k systémovým souborům nebo uživatelským složkám. Využíváme k tomu funkce os.getenv() – pro čtení a os.putenv() – pro nastavování. Díky tomu získáme cestu k systémovým složkám nebo nastavíme novou proměnnou pro různé účely.
print(os.getenv('PATH')) # získá cestu k systémovým proměnným PATH
os.putenv('NOVAPROMENNA', 'hodnota')
Spuštění systémových příkazů
Pomocí Pythonu můžeme spouštět i příkazy operačního systému. Funkce os.system() nám umožňuje spustit jakýkoliv příkaz, který bychom normálně spustili v příkazové řádce. To využijeme třeba při práci se skripty, které potřebují volat systémové příkazy.
os.system('echo Ahoj, světe!')
Zdroje
Seznam zdrojů
itnetwork.cz. Online. Dostupné z: https://www.itnetwork.cz/.
w3schools.com. Online. Dostupné z: https://www.w3schools.com/.
Python 3 documentation. Online. Dostupné z: https://docs.python.org/3/
SMOLKA, Pavel. Programovací jazyk Python [online]. Mendelova univerzita v Brně, 2019. Dostupné z: https://emendelu.publi.cz/book/771-programovaci-jazyk-python-pruvodce-studiem
ŠVEC, Jan. Učebnice jazyka Python (aneb Létající cirkus) [online]. 2002. Dostupné z: https://i.iinfo.cz/files/root/k/Ucebnice_jazyka_Python.pdf
PILGRIM, Mark. Ponořme se do Python(u) 3: Dive into Python 3. CZ.NIC. Praha: CZ.NIC, c2010. ISBN 978-80-904248-2-1.
PECINOVSKÝ, Rudolf. Python: kompletní příručka jazyka pro verzi 3.11. Knihovna programátora (Grada). Praha: Grada Publishing, 2023. ISBN 978-80-271-3891-3.
Další zdroje (Youtube, obrázky) jsou vždy uvedeny.
