Jak v Pythonu pracovat se složkami rychle a efektivně
- Co je adresář a složka v Pythonu
- Rozdíl mezi adresářem a pracovním adresářem
- Modul os pro práci se složkami
- Vytvoření nové složky pomocí os.mkdir
- Vytvoření více složek najednou s os.makedirs
- Výpis obsahu adresáře přes os.listdir
- Mazání prázdných a neprázdných složek
- Přejmenování a přesun adresářů v Pythonu
- Modul pathlib jako moderní alternativa
- Zjištění aktuálního pracovního adresáře
- Procházení adresářové struktury pomocí os.walk
- Ošetření chyb při práci se složkami
Co je adresář a složka v Pythonu
V programování obecně, a v Pythonu zvláště, se setkáváme s pojmy, které jsou na první pohled jasné, ale při hlubším zkoumání odhalují svou komplexnost. Jedním z takových pojmů je adresář a složka, přičemž tyto dva termíny jsou v praxi používány jako synonyma, i když jejich původ se mírně liší. Složka je termín, který pochází spíše z grafického uživatelského rozhraní operačního systému, zatímco adresář je techničtější označení používané v kontextu souborových systémů a programování.
Z pohledu Pythonu je adresář struktura souborového systému, která slouží k organizaci souborů a dalších adresářů do hierarchické podoby. Představte si to jako fyzický šanon v kanceláři, kde máte jednotlivé přihrádky, do nichž ukládáte dokumenty. Každý adresář může obsahovat libovolný počet souborů a zároveň může obsahovat další adresáře, kterým říkáme podadresáře. Tato hierarchická struktura tvoří základ toho, jak operační systémy organizují data na pevném disku nebo jiném úložném médiu.
Když pracujeme s Pythonem, velmi často potřebujeme s adresáři manipulovat. Ať už jde o čtení souborů z určitého umístění, ukládání výstupů skriptu nebo organizaci projektových souborů, porozumění tomu, jak Python pracuje s adresáři, je naprosto zásadní. Python nabízí hned několik způsobů, jak s adresáři pracovat, přičemž nejpoužívanějším nástrojem je modul os, který je součástí standardní knihovny, a modernější modul pathlib, jenž byl představen v Pythonu 3.4 a přináší objektově orientovaný přístup k práci se souborovým systémem.
Každý běžící Python skript má takzvaný aktuální pracovní adresář, anglicky current working directory, zkráceně CWD. Tento adresář je výchozím místem, odkud Python hledá soubory, pokud nezadáme absolutní cestu. Absolutní cesta je úplná cesta od kořenového adresáře systému, například /home/uzivatel/dokumenty/projekt na systémech Linux nebo Mac, nebo C:\Users\uzivatel\dokumenty\projekt na systémech Windows. Relativní cesta naproti tomu vychází z aktuálního pracovního adresáře a popisuje cestu k souboru nebo adresáři relativně k tomuto výchozímu bodu.
Je důležité si uvědomit, že práce s adresáři v Pythonu je multiplatformní záležitostí. Různé operační systémy používají různé oddělovače cest, přičemž Windows používá zpětné lomítko a Unix-like systémy používají lomítko dopředu. Python s tímto rozdílem dokáže pracovat, a proto je vhodné používat nástroje, které tento rozdíl automaticky řeší, jako je právě modul pathlib nebo funkce os.path.join(), která správně sestaví cestu bez ohledu na to, na jakém operačním systému skript běží.
Adresáře v Pythonu mají také své oprávnění a atributy, stejně jako soubory. Každý adresář má svého vlastníka, skupinu a sadu oprávnění, která určují, kdo může adresář číst, zapisovat do něj nebo jej spouštět. V kontextu Pythonu to znamená, že pokud se pokusíme vytvořit adresář nebo do něj zapisovat bez příslušných oprávnění, Python vyvolá výjimku, nejčastěji PermissionError, kterou musíme v kódu ošetřit.
Pochopení rozdílu mezi absolutní a relativní cestou je klíčové pro každého, kdo chce psát robustní a přenositelné Python skripty. Začínající programátoři často narážejí na problémy právě proto, že nepochopili, jak Python interpretuje cesty k souborům a adresářům. Správná práce s adresáři je tedy základním kamenem každého seriózního Python projektu a znalost příslušných nástrojů a technik výrazně usnadňuje každodenní programátorskou práci.
Rozdíl mezi adresářem a pracovním adresářem
V Pythonu se velmi často setkáváme s pojmy, které na první pohled vypadají jako synonyma, ale ve skutečnosti označují různé věci. Jedním z takových případů je rozdíl mezi pojmem adresář a pojmem pracovní adresář. Pokud tento rozdíl nepochopíte hned na začátku, může vás to stát hodiny zbytečného debugování a frustrací při práci se soubory.
Adresář, nebo jak mu někteří říkají složka, je jednoduše místo na disku vašeho počítače, kde jsou uloženy soubory nebo jiné adresáře. Je to fyzické umístění v souborovém systému. Může to být například C:\Users\Jan\Dokumenty na Windows nebo /home/jan/dokumenty na Linuxu. Adresář existuje nezávisle na tom, zda s ním právě pracujete nebo ne. Prostě tam je, čeká na vás a uchovává vaše data.
Pracovní adresář je ale něco jiného. Pracovní adresář, anglicky current working directory nebo zkráceně CWD, je adresář, ve kterém se váš Python skript právě nachází z pohledu operačního systému v daném okamžiku běhu programu. Jinými slovy, je to výchozí bod, od kterého Python odvozuje všechny relativní cesty k souborům, pokud mu neřeknete jinak. Když spustíte skript, Python si automaticky nastaví pracovní adresář na ten adresář, ze kterého byl skript spuštěn, což ale nemusí být vždy adresář, kde samotný skript leží.
Tady přichází zdroj mnoha problémů. Představte si, že máte skript uložený v /home/jan/projekty/muj_projekt/skript.py a spustíte ho z terminálu, přičemž se nacházíte v adresáři /home/jan. V takovém případě bude pracovní adresář /home/jan, nikoliv /home/jan/projekty/muj_projekt. Pokud tedy ve skriptu napíšete něco jako open(data.csv), Python bude hledat soubor data.csv v /home/jan, a ne tam, kde leží váš skript. To je přesně ten moment, kdy začínají problémy.
V Pythonu můžete zjistit aktuální pracovní adresář pomocí modulu os a funkce os.getcwd(). Tato funkce vrátí řetězec s absolutní cestou k aktuálnímu pracovnímu adresáři. Pokud chcete pracovní adresář změnit, použijete funkci os.chdir(), které předáte cestu k adresáři, na který chcete přepnout. Je ale dobré si uvědomit, že tato změna platí pouze pro aktuální běh programu a nijak neovlivní ostatní programy ani terminál.
Moderní Python nabízí také modul pathlib, který přináší objektově orientovaný přístup k práci s cestami a adresáři. Pomocí Path.cwd() získáte aktuální pracovní adresář jako objekt třídy Path, se kterým se pak pracuje mnohem pohodlněji než s prostými řetězci. Tento přístup je dnes považován za modernější a doporučovaný způsob práce se souborovým systémem v Pythonu.
Důležité je také zmínit, že pracovní adresář se může měnit v průběhu běhu programu, zatímco adresář, ve kterém leží váš skript, zůstává vždy stejný. Proto je při psaní robustních aplikací dobrou praxí používat absolutní cesty nebo cesty odvozené od umístění samotného skriptu, nikoliv od pracovního adresáře. K tomu slouží speciální proměnná __file__, která obsahuje cestu k aktuálně spuštěnému skriptu, a kombinací s funkcemi z modulu os nebo pathlib lze sestavit spolehlivé absolutní cesty bez ohledu na to, odkud byl skript spuštěn.
Pochopení tohoto rozdílu je základním kamenem pro každého, kdo chce v Pythonu pracovat se soubory spolehlivě a bez zbytečných překvapení.
Modul os pro práci se složkami
Python nabízí celou řadu nástrojů pro práci se souborovým systémem, přičemž jedním z nejzákladnějších a nejpoužívanějších je modul os. Tento modul je součástí standardní knihovny Pythonu, takže ho není potřeba instalovat – stačí ho jednoduše importovat na začátku skriptu pomocí příkazu import os. Modul os poskytuje přenositelný způsob, jak pracovat s operačním systémem, a to včetně práce se složkami a adresáři.
Když začnete pracovat se složkami v Pythonu, první věc, kterou pravděpodobně budete potřebovat, je zjistit, ve kterém adresáři se aktuálně nacházíte. K tomu slouží funkce os.getcwd(), která vrátí cestu k aktuálnímu pracovnímu adresáři jako řetězec. Například pokud pracujete na projektu uloženém v adresáři /home/uzivatel/projekty, tato funkce vám přesně tuto cestu vrátí. Je to velmi praktické zejména tehdy, kdy si nejste jisti, z jakého místa skript spouštíte.
Pokud chcete změnit aktuální pracovní adresář, použijete funkci os.chdir(), do které předáte cestu k cílovému adresáři. Tato funkce funguje podobně jako příkaz cd v příkazovém řádku. Je důležité si uvědomit, že pokud zadaná cesta neexistuje, Python vyhodí výjimku FileNotFoundError, takže je dobré tuto situaci ošetřit pomocí bloku try-except.
Vytváření nových složek je v Pythonu velmi jednoduché díky funkci os.mkdir(). Tato funkce vytvoří jednu novou složku na zadané cestě. Pokud však potřebujete vytvořit celou hierarchii složek najednou, tedy například složku a všechny její nadřazené složky, které ještě neexistují, sáhnete po funkci os.makedirs(). Tato funkce je výrazně mocnější a v praxi se používá velmi často, zejména při automatizaci různých úloh spojených s organizací souborů.
Pro výpis obsahu adresáře slouží funkce os.listdir(), která vrátí seznam všech souborů a složek nacházejících se v zadaném adresáři. Pokud funkci nezadáte žádný argument, použije aktuální pracovní adresář. Výsledkem je prostý seznam řetězců, kde každý řetězec představuje název jednoho souboru nebo složky. Tato funkce ale nerozlišuje mezi soubory a složkami, takže pokud potřebujete toto rozlišení, musíte použít doplňující funkce jako os.path.isdir() nebo os.path.isfile().
Mazání složek se provádí pomocí funkce os.rmdir(), která odstraní prázdnou složku. Pokud složka není prázdná, funkce selže a vyhodí výjimku. Pro mazání složek včetně jejich obsahu je potřeba použít modul shutil a jeho funkci shutil.rmtree(), která rekurzivně odstraní celý adresářový strom.
Velmi užitečnou součástí modulu os je podmodul os.path, který obsahuje celou řadu funkcí pro práci s cestami. Funkce os.path.join() umožňuje skládat cesty z více částí způsobem, který je nezávislý na operačním systému – automaticky používá správný oddělovač, ať už jde o lomítko na Linuxu nebo zpětné lomítko na Windows. Funkce os.path.exists() pak jednoduše vrátí True nebo False podle toho, zda zadaná cesta existuje, což je neocenitelné při psaní robustních skriptů.
Dalším zajímavým nástrojem je funkce os.walk(), která umožňuje rekurzivně procházet celý adresářový strom. Tato funkce je generátor, který pro každý adresář vrátí trojici obsahující cestu k adresáři, seznam jeho podadresářů a seznam souborů v něm obsažených. Díky tomu lze velmi elegantně zpracovat celé složité adresářové struktury bez nutnosti psát vlastní rekurzivní funkce. Použití os.walk() je typické například při hledání konkrétních souborů v celém projektu nebo při provádění hromadných operací nad soubory určitého typu.
Práce s absolutními a relativními cestami je dalším tématem, které modul os řeší velmi dobře. Funkce os.path.abspath() převede relativní cestu na absolutní, což je užitečné tehdy, kdy chcete mít jistotu, že pracujete se správným umístěním bez ohledu na to, odkud byl skript spuštěn. Naproti tomu funkce os.path.relpath() vrátí relativní cestu z jednoho místa do druhého.
Celkově lze říci, že modul os je naprosto nepostradatelným nástrojem pro každého Python programátora, který pracuje se souborovým systémem. Jeho funkce jsou navrženy tak, aby byly přenositelné napříč různými operačními systémy, a přitom nabízely dostatečnou flexibilitu pro řešení prakticky jakéhokoliv úkolu spojeného se správou adresářů a složek.
Vytvoření nové složky pomocí os.mkdir
V Pythonu existuje několik způsobů, jak pracovat se souborovým systémem, a jedním z nejzákladnějších úkolů, se kterými se programátor setká, je vytvoření nové složky. K tomuto účelu slouží funkce os.mkdir(), která je součástí standardní knihovny `os`. Tato knihovna poskytuje rozhraní pro interakci s operačním systémem a její správné použití je klíčové pro každého, kdo chce v Pythonu efektivně pracovat s adresáři a soubory.
Než začneme samotné vytváření složek, je nutné knihovnu `os` do našeho skriptu naimportovat. Děje se tak velmi jednoduše pomocí příkazu import os na začátku souboru. Bez tohoto importu by Python o funkci `os.mkdir()` vůbec nevěděl a při pokusu o její zavolání by skript skončil chybou. Je to jeden z těch základních kroků, na které začátečníci občas zapomínají, a pak se diví, proč jejich kód nefunguje.
Samotná funkce `os.mkdir()` přijímá jako argument cestu k adresáři, který chceme vytvořit. Tato cesta může být buď absolutní, nebo relativní. Absolutní cesta začíná od kořenového adresáře systému, například `/home/uzivatel/novy_adresar` na Linuxu nebo `C:\\Users\\Uzivatel\\novy_adresar` na Windows. Relativní cesta se vztahuje k aktuálnímu pracovnímu adresáři, ve kterém je skript spuštěn. Pokud tedy napíšeme `os.mkdir(nova_slozka)`, Python se pokusí vytvořit složku s názvem `nova_slozka` přímo v adresáři, ze kterého byl skript spuštěn.
Důležité je vědět, že os.mkdir() dokáže vytvořit pouze jednu úroveň adresáře najednou. To znamená, že pokud se pokusíme vytvořit cestu jako `slozka_a/slozka_b/slozka_c`, přičemž ani jedna z těchto složek neexistuje, funkce selže a vyhodí výjimku `FileNotFoundError`. V takovém případě je vhodnější použít funkci os.makedirs(), která umí vytvořit celý strom adresářů najednou, včetně všech meziúrovní. Rozdíl mezi těmito dvěma funkcemi je zásadní a každý programátor by ho měl znát, aby se vyhnul zbytečným chybám ve svých projektech.
Dalším častým problémem, na který narazíme při používání `os.mkdir()`, je situace, kdy složka, kterou se pokoušíme vytvořit, již existuje. V takovém případě Python vyhodí výjimku FileExistsError. Aby náš program byl robustní a nezhavaroval při každém opakovaném spuštění, je dobré tuto situaci ošetřit. Nejčastěji se to dělá pomocí bloku `try/except`, kde zachytíme zmíněnou výjimku a buď ji ignorujeme, nebo uživateli zobrazíme srozumitelnou zprávu. Alternativně lze před samotným voláním `os.mkdir()` zkontrolovat, zda složka již existuje, a to pomocí funkce `os.path.exists()` nebo `os.path.isdir()`.
Praktický příklad použití by mohl vypadat takto: nejprve zkontrolujeme, zda cílová složka existuje, a pokud ne, vytvoříme ji. Tímto způsobem se vyhneme zbytečným výjimkám a náš kód bude čitelnější a spolehlivější. Je to dobrá programátorská praxe, která se vyplatí zejména v situacích, kdy skript spouštíme opakovaně nebo v různých prostředích.
Při práci s cestami v Pythonu je také vhodné zmínit modul os.path, který nabízí celou řadu užitečných funkcí pro manipulaci s cestami. Funkce jako `os.path.join()` umožňují skládat cesty způsobem, který je kompatibilní s různými operačními systémy. Je totiž dobře známo, že Windows používá zpětné lomítko jako oddělovač adresářů, zatímco Linux a macOS používají lomítko přímé. Použití `os.path.join()` tento problém elegantně řeší a zajišťuje, že náš kód bude fungovat správně na všech platformách.
Od Pythonu 3.4 existuje také alternativní způsob práce s adresáři prostřednictvím modulu pathlib. Třída `Path` z tohoto modulu nabízí objektově orientovaný přístup k souborovému systému a mnoho programátorů ji dnes preferuje před klasickým modulem `os`. Nicméně `os.mkdir()` zůstává stále velmi používanou a spolehlivou funkcí, která je součástí každého základního kurzu Pythonu a jejíž znalost je nepostradatelná.
Vytvoření více složek najednou s os.makedirs
Práce s adresáři v Pythonu je jednou z těch věcí, které se zdají jednoduché, dokud nenarazíte na situaci, kdy potřebujete vytvořit celou hierarchii složek najednou. Přesně pro takové případy existuje funkce os.makedirs(), která je součástí standardní knihovny Pythonu a umožňuje vytvořit celou stromovou strukturu adresářů jediným voláním.
Základní rozdíl mezi os.mkdir() a os.makedirs() spočívá v tom, že první jmenovaná funkce dokáže vytvořit pouze jednu složku, přičemž její nadřazená složka musí již existovat. Pokud se pokusíte pomocí os.mkdir() vytvořit cestu jako například /projekty/python/muj_projekt/data a složka python ještě neexistuje, Python vyhodí výjimku a celá operace selže. Oproti tomu os.makedirs() projde celou zadanou cestu a vytvoří všechny chybějící složky v hierarchii, ať jich je jedna nebo deset.
Použití funkce je přímočaré. Stačí importovat modul os a zavolat funkci s požadovanou cestou jako argumentem. Například příkaz os.makedirs(/projekty/python/muj_projekt/data) vytvoří všechny složky najednou, pokud neexistují. Tato funkce respektuje operační systém, na kterém běží, takže na Windows bude pracovat s cestami ve Windows formátu a na Linuxu nebo macOS s unixovými cestami.
Jedním z nejčastějších problémů, se kterými se programátoři při práci s os.makedirs() setkávají, je situace, kdy složka již existuje. V takovém případě starší verze Pythonu vyhodily výjimku FileExistsError, což bylo poměrně nepraktické, protože jste museli vždy kontrolovat, zda složka existuje, ještě před samotným voláním funkce. Python 3.2 přinesl elegantní řešení v podobě parametru exist_ok. Pokud nastavíte exist_ok=True, funkce tiše přeskočí vytváření složek, které již existují, a nevyhodí žádnou výjimku. Toto je dnes považováno za best practice a ve většině projektů byste tento parametr měli používat jako výchozí volbu.
Dalším důležitým aspektem je práce s relativními a absolutními cestami. os.makedirs() pracuje stejně dobře s oběma typy. Pokud použijete relativní cestu jako například data/vstupy/soubory, složky budou vytvořeny relativně k aktuálnímu pracovnímu adresáři, který můžete zjistit pomocí os.getcwd(). Absolutní cesty jsou jednoznačnější a méně náchylné k chybám, zvláště pokud váš skript může být spouštěn z různých umístění.
V moderním Pythonu existuje ještě jeden způsob, jak dosáhnout stejného výsledku, a to pomocí modulu pathlib, který byl představen v Pythonu 3.4. Třída Path z tohoto modulu nabízí metodu mkdir() s parametry parents=True a exist_ok=True, která funguje velmi podobně jako os.makedirs(). Mnoho vývojářů dnes preferuje pathlib pro jeho objektově orientovaný přístup a čitelnější syntaxi, nicméně os.makedirs() zůstává stále velmi rozšířenou a plně funkční volbou, zejména v starším kódu nebo v prostředích, kde je důležitá zpětná kompatibilita.
Při práci s os.makedirs() je také dobré mít na paměti oprávnění k vytváření složek. Funkce přijímá volitelný parametr mode, který určuje oprávnění nově vytvořených složek na unixových systémech. Výchozí hodnota je 0o777, ale skutečná oprávnění jsou ovlivněna hodnotou umask procesu. Na Windows je tento parametr ignorován, takže pokud píšete přenositelný kód, neměli byste se na něj spoléhat jako na primární mechanismus zabezpečení.
Praktické využití os.makedirs() najdete v nejrůznějších situacích. Při vytváření struktury projektu, při generování výstupních složek pro různé typy dat, při organizaci logů podle data nebo při přípravě prostředí pro automatizované testy. Funkce je spolehlivá, dobře zdokumentovaná a její chování je předvídatelné, což z ní dělá nástroj, který by měl znát každý Python programátor pracující se souborovým systémem.
Výpis obsahu adresáře přes os.listdir
Práce se soubory a adresáři patří k základním dovednostem každého programátora, který se věnuje Pythonu. Jednou z nejpoužívanějších funkcí pro práci s obsahem složek je funkce os.listdir(), která pochází z modulu os. Tento modul je součástí standardní knihovny Pythonu, takže není potřeba instalovat žádné externí balíčky – stačí ho jednoduše importovat na začátku skriptu pomocí příkazu import os.
Funkce os.listdir() slouží k tomu, aby vrátila seznam všech položek nacházejících se v zadaném adresáři. Tím se rozumí jak soubory, tak i podsložky. Výsledkem volání této funkce je seznam řetězců, kde každý řetězec představuje název jedné položky. Je důležité si uvědomit, že funkce nevrací celou cestu k souboru, ale pouze samotný název. Pokud tedy pracujete s adresářem /home/uzivatel/dokumenty a v něm se nachází soubor zprava.txt, funkce vrátí pouze řetězec zprava.txt, nikoliv celou absolutní cestu.
Použití je velmi jednoduché. Stačí funkci předat cestu k adresáři, jehož obsah chcete vypsat. Pokud chcete zobrazit obsah aktuálního pracovního adresáře, můžete jako argument předat tečku, tedy os.listdir(.), nebo funkci zavolat zcela bez argumentu, protože výchozí hodnota je právě aktuální adresář. Výsledek pak můžete procházet pomocí cyklu for a s každou položkou provádět libovolné operace.
Velmi praktické je kombinovat os.listdir() s dalšími funkcemi modulu os, například s os.path.isfile() nebo os.path.isdir(). Díky tomu lze snadno rozlišit, zda je daná položka souborem nebo složkou. Pokud například chcete vypsat pouze soubory a ignorovat podsložky, stačí v cyklu přidat podmínku, která ověří, zda je daná položka souborem. Podobně lze filtrovat pouze adresáře, pokud vás zajímá struktura složek.
Další užitečnou technikou je spojení názvu položky s cestou k nadřazenému adresáři pomocí funkce os.path.join(). Tato funkce zajistí správné formátování cesty bez ohledu na operační systém, na kterém váš skript běží. To je důležité zejména tehdy, když chcete psát kód, který bude fungovat jak na Windows, tak na Linuxu nebo macOS, protože každý systém používá jiný oddělovač v cestách.
Je také dobré vědět, že os.listdir() neřadí výsledky podle žádného konkrétního klíče. Pořadí položek ve vráceném seznamu závisí na operačním systému a souborovém systému. Pokud potřebujete abecedně seřazený výpis, je potřeba výsledek explicitně seřadit pomocí funkce sorted(). To je velmi běžná praxe, protože přehledně seřazený výpis obsahu adresáře je mnohem lépe čitelný a snáze se s ním pracuje.
Jednou z nevýhod os.listdir() oproti modernějším alternativám je to, že nepracuje rekurzivně. To znamená, že zobrazí pouze obsah zadaného adresáře, ale neprojde obsah podsložek. Pokud potřebujete procházet celý strom adresářů včetně vnořených složek, je lepší sáhnout po funkci os.walk(), která toto umožňuje. Nicméně pro jednoduché úlohy, kdy stačí vypsat obsah jednoho konkrétního adresáře, je os.listdir() naprosto dostačující a elegantní řešení.
V praxi se os.listdir() hojně využívá například při zpracování dávek souborů, automatizaci úloh, analýze dat nebo při psaní skriptů pro správu souborového systému. Každý, kdo s Pythonem pracuje pravidelně, se s touto funkcí setká velmi brzy a rychle si na ni zvykne jako na spolehlivý nástroj pro orientaci v obsahu složek.
Každý dobrý projekt začíná tam, kde má své kořeny – ve správně pojmenovaném adresáři, protože chaos ve složkách je jako džungle bez mapy, nikdy nevíš, co tě čeká za dalším rohem.
Radovan Blažek
Mazání prázdných a neprázdných složek
V Pythonu existuje několik způsobů, jak mazat složky, a záleží především na tom, zda je složka prázdná nebo obsahuje nějaké soubory a podsložky. Toto rozlišení je klíčové, protože standardní funkce v Pythonu se chovají odlišně v závislosti na obsahu adresáře.
Pokud pracujete s prázdnou složkou, máte k dispozici jednoduchou a přímočarou metodu. Modul `os` nabízí funkci `os.rmdir()`, která slouží právě k odstranění prázdných adresářů. Použití je velmi jednoduché — stačí předat cestu ke složce jako argument. Pokud však složka není prázdná, tato funkce vyhodí výjimku `OSError`, respektive `FileNotFoundError` nebo `PermissionError`, v závislosti na konkrétní situaci. Proto je vždy dobré před voláním `os.rmdir()` ověřit, zda složka skutečně neobsahuje žádné soubory ani podsložky.
Situace se výrazně komplikuje ve chvíli, kdy potřebujete smazat neprázdnou složku včetně veškerého jejího obsahu. V takovém případě přichází na řadu modul `shutil` a jeho funkce `shutil.rmtree()`. Tato funkce rekurzivně projde celý adresářový strom a smaže všechny soubory i podsložky, které se v dané složce nacházejí. Je to velmi mocný nástroj, ale právě proto je třeba s ním zacházet opatrně. Stačí totiž jediné chybné volání a přijdete o data, která jste smazat nechtěli.
`shutil.rmtree()` přijímá jako první argument cestu k adresáři, který chcete odstranit. Volitelně lze také nastavit parametr `ignore_errors=True`, který způsobí, že funkce bude ignorovat chyby vzniklé při mazání. Alternativně lze použít parametr `onerror`, kde předáte vlastní funkci, která se zavolá v případě, že dojde k chybě. Tato flexibilita je velmi užitečná v situacích, kdy například nemáte dostatečná oprávnění ke smazání některých souborů.
Při práci s adresáři v Pythonu je také důležité myslet na ošetření výjimek. Doporučuje se vždy obalit mazací operace do bloku `try-except`, aby program nespadl v případě neočekávané situace. Například složka, kterou chcete smazat, nemusí vůbec existovat, nebo může být aktuálně používána jiným procesem. Výjimka `FileNotFoundError` nastane tehdy, když zadaná cesta neexistuje, zatímco `PermissionError` signalizuje nedostatečná oprávnění.
Od Pythonu 3.4 je k dispozici také modul `pathlib`, který přináší objektově orientovaný přístup k práci se souborovým systémem. Třída `Path` nabízí metodu `Path.rmdir()`, která funguje podobně jako `os.rmdir()` — tedy maže pouze prázdné adresáře. Pokud chcete pomocí `pathlib` smazat neprázdnou složku, musíte stále sáhnout po `shutil.rmtree()`, nebo ručně projít obsah složky a mazat soubory jeden po druhém.
Ruční procházení adresáře a mazání jeho obsahu je sice pracnější, ale dává programátorovi plnou kontrolu nad tím, co se maže. Pomocí `os.listdir()` nebo `os.walk()` lze projít celý obsah adresáře a selektivně mazat pouze určité typy souborů. Funkce `os.walk()` generuje trojice obsahující cestu k adresáři, seznam podsložek a seznam souborů, což umožňuje velmi přesné řízení celého procesu mazání.
Je také důležité zmínit, že mazání adresářů je nevratná operace. Na rozdíl od přesunutí souboru do koše v grafickém rozhraní operačního systému, Python standardně maže soubory a složky natrvalo bez možnosti obnovy. Proto by měl každý skript, který provádí mazání, obsahovat dostatečné pojistky — ať už ve formě potvrzovacích dialogů, logování mazaných položek, nebo zálohy dat před samotným smazáním.
V produkčním prostředí se velmi osvědčuje před spuštěním mazacího skriptu nejprve provést tzv. dry run, tedy simulaci mazání, při které se pouze vypíše, co by bylo smazáno, aniž by k samotnému mazání skutečně došlo. Tento přístup pomáhá předejít nechtěným ztrátám dat a dává vývojáři možnost zkontrolovat správnost logiky skriptu.
Přejmenování a přesun adresářů v Pythonu
Práce se souborovým systémem patří mezi základní dovednosti každého programátora, který pracuje s Pythonem. Ať už vyvíjíte jednoduchou aplikaci nebo složitý systém pro správu dat, dříve nebo později narazíte na potřebu přejmenovat nebo přesunout adresář. Python nabízí hned několik způsobů, jak tuto operaci provést, a každý z nich má své výhody i nevýhody.
Nejčastěji používaným modulem pro práci s adresáři a soubory je modul os, který je součástí standardní knihovny Pythonu. Tento modul obsahuje funkci os.rename(), která slouží k přejmenování jak souborů, tak adresářů. Syntaxe je velmi přímočará — funkci předáte dva argumenty, přičemž první je původní cesta a druhý je nová cesta nebo nový název. Pokud pracujete na stejném souborovém systému, funguje tato funkce bezproblémově. Problém ale nastane ve chvíli, kdy se pokoušíte přesunout adresář na jiný disk nebo oddíl. V takovém případě funkce os.rename() selže a vyhodí výjimku.
Pro přesun adresářů mezi různými umístěními, včetně přesunu mezi různými disky, je vhodnější použít modul shutil a konkrétně funkci shutil.move(). Tato funkce se chová podobně jako příkaz mv v Unixových systémech nebo příkaz move ve Windows. Dokáže přesunout celý adresář včetně veškerého jeho obsahu na nové místo. Pokud cílová cesta již existuje a jedná se o adresář, přesune se zdrojový adresář dovnitř cílového adresáře. Pokud cílová cesta neexistuje, adresář se přejmenuje nebo přesune na zadané místo.
Moderní přístup k práci s adresáři v Pythonu nabízí modul pathlib, který byl představen v Pythonu 3.4 a od té doby si získal velkou popularitu. Objekt Path z tohoto modulu disponuje metodou rename(), která funguje podobně jako os.rename(), ale díky objektově orientovanému přístupu je práce s cestami mnohem přehlednější a intuitivnější. Zápis kódu je čistší a srozumitelnější, zejména pro vývojáře, kteří preferují moderní styl programování.
Při přejmenování adresářů je důležité myslet na několik věcí. Zaprvé, cílový adresář nesmí existovat, pokud používáte funkci os.rename() nebo metodu rename() z pathlibu — jinak operace selže. Zadruhé, je nutné mít dostatečná oprávnění pro zápis do nadřazeného adresáře. Zatřetí, při přesunu adresářů na Windows může nastat problém, pokud jsou soubory v daném adresáři právě otevřeny jiným procesem.
Velmi praktická je také kombinace modulu os s funkcí os.renames(), která na rozdíl od os.rename() dokáže vytvořit i chybějící mezinadřazené adresáře v cílové cestě. Tato funkce je méně známá, ale v praxi může ušetřit hodně práce, protože nemusíte ručně vytvářet celou adresářovou strukturu před samotným přesunem.
Pokud potřebujete přejmenovat nebo přesunout větší množství adresářů najednou, je vhodné napsat si vlastní funkci, která projde seznam adresářů a provede požadované operace. Při tom je dobré implementovat ošetření výjimek pomocí bloku try-except, aby program nespadl při první chybě, ale pokračoval dál a chybu zalogoval. Typické výjimky, se kterými se setkáte, jsou FileNotFoundError, PermissionError nebo FileExistsError.
Zajímavou situací je přejmenování adresáře v rámci stejného nadřazeného adresáře, což je vlastně nejjednodušší případ. Stačí zavolat os.rename() nebo Path.rename() se stejnou nadřazenou cestou a novým názvem. Python tuto operaci provede atomicky na většině operačních systémů, což znamená, že nenastane situace, kdy by adresář existoval pod oběma názvy současně.
Pro vývojáře, kteří pracují na projektech vyžadujících přesnou kontrolu nad souborovým systémem, je důležité vědět, že shutil.move() interně nejprve zkusí použít os.rename(), a pokud to není možné, zkopíruje obsah na nové místo a původní adresář smaže. Toto chování je klíčové při práci s různými souborovými systémy nebo při přesunu dat mezi disky.
Celkově lze říci, že Python poskytuje bohaté nástroje pro přejmenování a přesun adresářů, přičemž volba konkrétního přístupu závisí na konkrétním případu použití, požadavcích na kompatibilitu a osobních preferencích vývojáře.
Modul pathlib jako moderní alternativa
Od verze 3.4 přináší Python modul pathlib, který zcela mění způsob, jakým vývojáři přistupují k práci se souborovým systémem. Zatímco starší přístupy využívaly kombinaci modulů `os` a `os.path`, pathlib nabízí objektově orientovaný přístup, který je intuitivnější, čitelnější a v mnoha ohledech elegantnější. Pokud jste dosud pracovali pouze s klasickými řetězcovými cestami, pathlib vám otevře úplně nový pohled na to, jak lze v Pythonu zacházet s adresáři a složkami.
| Vlastnost | os modul | pathlib modul | os.path modul |
|---|---|---|---|
| Dostupnost od verze Pythonu | Python 1.x | Python 3.4 | Python 1.x |
| Vytvoření adresáře | os.mkdir() | Path.mkdir() | není přímo podporováno |
| Výpis obsahu složky | os.listdir() | Path.iterdir() | není přímo podporováno |
| Objektově orientovaný přístup | Ne | Ano | Ne |
| Spojení cest | os.path.join() | Path / "podsložka" | os.path.join() |
| Kontrola existence adresáře | os.path.exists() | Path.exists() | os.path.exists() |
| Přejmenování složky | os.rename() | Path.rename() | není přímo podporováno |
| Získání aktuálního adresáře | os.getcwd() | Path.cwd() | není přímo podporováno |
| Čitelnost kódu | Střední | Vysoká | Střední |
| Podpora pro Windows i Linux | Ano | Ano | Ano |
Základním stavebním kamenem celého modulu je třída Path. Pomocí ní lze reprezentovat libovolnou cestu v souborovém systému, ať už jde o soubor nebo adresář. Vytvoření instance je jednoduché — stačí napsat `from pathlib import Path` a poté `p = Path('.')`, čímž získáte objekt reprezentující aktuální pracovní adresář. Od tohoto momentu máte k dispozici celou řadu metod a vlastností, které vám práci s adresáři výrazně usnadní.
Jednou z nejčastěji využívaných operací je procházení obsahu adresáře. Metoda `iterdir()` vrátí iterátor přes všechny položky v daném adresáři, přičemž každá položka je opět objektem třídy Path. To znamená, že na ni okamžitě můžete volat další metody, například `is_dir()` pro ověření, zda jde o složku, nebo `is_file()` pro soubory. Tento přístup je mnohem přirozenější než ruční skládání cest pomocí `os.path.join()`.
Velmi praktická je také metoda `glob()`, která umožňuje vyhledávat soubory a složky podle vzoru. Pokud chcete najít všechny Python soubory v adresáři, napíšete jednoduše `list(p.glob('*.py'))`. Pro rekurzivní prohledávání celého stromu adresářů pak slouží metoda `rglob()`, která automaticky prochází všechny podsložky. Tato funkcionalita bývala dříve dostupná pouze přes `os.walk()`, jehož syntaxe je výrazně méně přehledná.
Práce s cestami samotná je v pathlib velmi pohodlná díky přetíženému operátoru lomítka. Místo zdlouhavého `os.path.join(base_dir, 'podsložka', 'soubor.txt')` jednoduše napíšete `base_dir / 'podsložka' / 'soubor.txt'`. Výsledek je okamžitě čitelnější a méně náchylný na chyby způsobené ručním skládáním řetězců.
Vytváření nových adresářů je s pathlib také velmi přímočaré. Metoda `mkdir()` přijímá parametr `parents=True`, který zajistí vytvoření celé hierarchie adresářů najednou, a parametr `exist_ok=True`, díky němuž nevznikne výjimka, pokud adresář již existuje. Tento vzor nahrazuje kombinaci podmínek a volání `os.makedirs()`, která byla dříve nutná.
Modul pathlib rovněž nabízí pohodlný přístup k různým částem cesty. Vlastnost `parent` vrátí nadřazený adresář, vlastnost `name` obsahuje název souboru nebo složky včetně přípony, `stem` vrátí název bez přípony a `suffix` samotnou příponu. Tyto vlastnosti eliminují potřebu volání funkcí jako `os.path.dirname()` nebo `os.path.basename()`.
Pro zjištění, zda daný adresář nebo soubor existuje, slouží metoda `exists()`. Kombinací s metodami `is_dir()` a `is_file()` lze snadno ověřit nejen existenci, ale i typ dané položky. Tato trojice metod pokrývá naprostou většinu situací, kdy vývojář potřebuje před dalším zpracováním ověřit stav souborového systému.
Důležité je zmínit také to, že pathlib je multiplatformní. Python automaticky vybere správnou implementaci podle operačního systému — na Linuxu a macOS se použije `PosixPath`, na Windows pak `WindowsPath`. Vývojář se tak nemusí starat o rozdíly v oddělovačích cest mezi jednotlivými platformami, což výrazně zjednodušuje psaní přenositelného kódu.
Čtení a zápis souborů je s pathlib také možné přímo bez nutnosti otevírat soubor přes `open()`. Metody `read_text()`, `write_text()`, `read_bytes()` a `write_bytes()` umožňují provádět základní operace se soubory na jediném řádku. Pro práci s konfiguračními soubory nebo menšími datovými soubory je to velmi pohodlná zkratka.
Celkově lze říci, že pathlib představuje moderní a doporučovaný způsob práce s adresáři a soubory v Pythonu. Nové projekty by měly tento modul využívat jako výchozí volbu, a i ve starším kódu se vyplatí postupná migrace od starých přístupů k pathlib. Kód se stane čitelnějším, kratším a snáze udržovatelným — a to jsou vlastnosti, na kterých záleží každému vývojáři, který pracuje s Pythonem profesionálně.
Zjištění aktuálního pracovního adresáře
Každý programátor, který pracuje s Pythonem, se dříve nebo později setká s potřebou zjistit, ve které složce se jeho skript právě nachází nebo odkud byl spuštěn. Tato zdánlivě jednoduchá operace je přitom základem pro správnou práci se soubory a adresáři v jakémkoliv projektu. Bez znalosti aktuálního pracovního adresáře by bylo velmi obtížné spolehlivě otevírat soubory, ukládat výsledky nebo načítat konfigurační soubory.
V Pythonu existuje několik způsobů, jak aktuální pracovní adresář zjistit. Nejčastěji se používá modul os, který je součástí standardní knihovny Pythonu a nabízí celou řadu funkcí pro práci s operačním systémem. Konkrétně funkce os.getcwd() vrátí řetězec obsahující absolutní cestu k aktuálnímu pracovnímu adresáři. Název funkce pochází z anglického „get current working directory, tedy „získej aktuální pracovní adresář. Použití je velmi přímočaré — stačí importovat modul os a zavolat tuto funkci bez jakýchkoliv argumentů.
Pokud tedy napíšete import os a následně print(os.getcwd()), Python vám okamžitě vypíše úplnou cestu k adresáři, ze kterého byl skript spuštěn. Na operačním systému Windows může výsledek vypadat například jako C:\Users\uzivatel\projekty\muj_projekt, zatímco na Linuxu nebo macOS uvidíte cestu ve formátu /home/uzivatel/projekty/muj_projekt. Tento rozdíl je důležité mít na paměti, pokud vyvíjíte aplikaci, která má běžet na více platformách.
Od verze Pythonu 3.4 je k dispozici také modernější přístup prostřednictvím modulu pathlib. Tento modul přináší objektově orientovaný způsob práce s cestami a mnoho vývojářů jej dnes preferuje před starším modulem os. Pro zjištění aktuálního pracovního adresáře pomocí pathlib stačí použít Path.cwd(), kde Path je třída importovaná z modulu pathlib. Výsledkem není prostý řetězec, ale objekt typu Path, se kterým lze dále velmi pohodlně pracovat — například jej snadno kombinovat s názvy souborů nebo podadresářů pomocí operátoru lomítka.
Je důležité si uvědomit, že aktuální pracovní adresář není totéž jako adresář, ve kterém se nachází samotný skript. Pokud spustíte skript z jiného umístění, než kde je uložen, os.getcwd() vrátí adresář, ze kterého jste příkaz spustili, nikoliv adresář se skriptem. Toto chování bývá zdrojem mnoha záludných chyb, zejména u začátečníků. Pokud potřebujete zjistit adresář, kde se nachází samotný soubor skriptu, je třeba použít speciální proměnnou __file__ v kombinaci s funkcemi pro práci s cestami.
Praktické využití zjišťování aktuálního pracovního adresáře je velmi široké. Při čtení konfiguračních souborů, při ukládání logů, při práci s datovými soubory nebo při dynamickém sestavování cest k různým zdrojům — všude tam se tato znalost hodí. Zkušení vývojáři obvykle na začátku skriptu aktuální adresář vypíší nebo zalogují, aby měli přehled o tom, odkud aplikace běží, a mohli případné problémy s cestami snáze diagnostikovat.
Celkově lze říci, že zvládnutí práce s aktuálním pracovním adresářem v Pythonu je jednou z těch základních dovedností, které sice na první pohled nevypadají nijak složitě, ale v praxi mají obrovský vliv na spolehlivost a přenositelnost vašeho kódu. Modul os i modul pathlib jsou vaši nejlepší přátelé, kdykoli potřebujete mít jistotu, že váš program ví, kde se právě nachází a kde má hledat nebo ukládat soubory.
Procházení adresářové struktury pomocí os.walk
Funkce os.walk patří mezi nejužitečnější nástroje, které Python nabízí pro práci s adresářovou strukturou. Pokud potřebujete projít celý strom složek a souborů, ať už za účelem vyhledávání, zpracování nebo analýzy dat, právě tato funkce vám ušetří spoustu práce a zbytečně složitého kódu.
Základní princip fungování os.walk spočívá v tom, že funkce postupně prochází zadaný adresář a všechny jeho podadresáře. Při každém průchodu vrací trojici hodnot, konkrétně aktuální cestu k adresáři, seznam podadresářů nacházejících se v daném adresáři a seznam souborů, které se v tomto adresáři nacházejí. Tato trojice se obvykle rozbaluje do proměnných pojmenovaných například root, dirs a files, přičemž pojmenování je čistě na programátorovi, ale tato konvence je velmi rozšířená a usnadňuje čitelnost kódu.
Než začnete s os.walk pracovat, je potřeba importovat modul os, který je součástí standardní knihovny Pythonu. Nepotřebujete tedy instalovat žádné externí balíčky, vše je dostupné ihned po instalaci interpretu. Samotné volání funkce pak vypadá jednoduše — stačí předat cestu k výchozímu adresáři, od kterého má procházení začít. Funkce sama se postará o rekurzivní průchod celou strukturou, takže nemusíte psát žádnou vlastní rekurzi.
Velmi důležitou vlastností funkce os.walk je to, že ve výchozím nastavení prochází adresářovou strukturu shora dolů, tedy nejprve zpracuje nadřazený adresář a teprve poté přejde na jeho podadresáře. Toto chování lze změnit pomocí parametru topdown, který pokud nastavíte na hodnotu False, způsobí, že průchod bude probíhat zdola nahoru. To se hodí například v situacích, kdy potřebujete nejprve zpracovat obsah podadresářů a teprve poté přejít na nadřazené složky, třeba při mazání prázdných adresářů.
Dalším zajímavým parametrem je followlinks. Ve výchozím stavu os.walk symbolické odkazy na adresáře nenásleduje, což je z bezpečnostního hlediska rozumné chování, protože symbolické odkazy mohou vést na libovolné místo v systému souborů a mohlo by dojít k nekonečné smyčce. Pokud však víte, co děláte, a potřebujete symbolické odkazy sledovat, stačí tento parametr nastavit na True.
Praktické využití os.walk je skutečně široké. Můžete pomocí ní vyhledat všechny soubory s určitou příponou v celém projektu, spočítat celkovou velikost adresáře včetně všech jeho podadresářů, nebo třeba najít duplicitní soubory porovnáváním jejich názvů či obsahu. Kombinace os.walk s dalšími funkcemi modulu os, jako jsou os.path.join, os.path.getsize nebo os.path.splitext, otevírá obrovské množství možností.
Při procházení adresářové struktury je dobré myslet také na výkon. Pokud pracujete s velmi rozsáhlým stromem adresářů obsahujícím tisíce nebo desetitisíce souborů, může průchod trvat delší dobu. V takovém případě je vhodné zvážit, zda není možné omezit hloubku průchodu nebo filtrovat podadresáře přímo v průběhu iterace. Toho lze dosáhnout tím, že v rámci smyčky upravíte obsah proměnné dirs přímo na místě — os.walk totiž respektuje změny provedené v tomto seznamu a přeskočí adresáře, které z něj odstraníte.
Zpracování chyb je při práci s os.walk také důležité téma. Funkce sama o sobě nevyhazuje výjimky při nedostatečných oprávněních k přístupu do adresáře, ale pokud se pokusíte otevřít nebo číst soubory, na které nemáte práva, narazíte na výjimku PermissionError. Proto je vhodné obalit operace se soubory blokem try-except, aby váš skript nespadl na prvním chráněném souboru, ale mohl pokračovat ve zpracování zbytku struktury.
Celkově lze říci, že os.walk je nepostradatelným nástrojem každého Python programátora, který pracuje se souborovým systémem. Jeho jednoduchost a flexibilita z něj dělají první volbu při jakémkoli úkolu spojeném s procházením adresářů a složek, ať už jde o jednoduché skripty nebo složitější aplikace pro správu souborů.
Ošetření chyb při práci se složkami
Při práci se složkami v Pythonu se dříve nebo později každý programátor setká se situací, kdy operace selže. Může jít o pokus o přístup ke složce, která neexistuje, o snahu vytvořit adresář na místě, kde k tomu nemáme oprávnění, nebo třeba o mazání složky, která je stále používána jiným procesem. Právě proto je správné ošetření chyb naprosto zásadní součástí každého robustního programu.
Python nabízí několik způsobů, jak se s chybami při práci se složkami vypořádat. Nejzákladnějším a nejpoužívanějším mechanismem je konstrukce try-except, která umožňuje zachytit výjimku a reagovat na ni smysluplným způsobem namísto toho, aby program jednoduše spadl s nečitelnou chybovou hláškou.
Vezměme si příklad, kdy se pokoušíme vytvořit nový adresář pomocí funkce os.makedirs(). Pokud složka již existuje, Python vyhodí výjimku FileExistsError. Abychom tomuto předešli, můžeme buď použít parametr exist_ok=True, nebo celou operaci obalit blokem try-except a výjimku zachytit ručně. Druhý přístup nám dává větší kontrolu nad tím, co se v případě chyby stane dál.
Podobná situace nastává při pokusu o přístup do složky, která neexistuje. Funkce jako os.listdir() nebo os.scandir() v takovém případě vyhodí výjimku FileNotFoundError. Je dobrou praxí tuto výjimku zachytit a uživateli sdělit srozumitelnou zprávu, případně nabídnout alternativní cestu nebo vytvořit chybějící adresář automaticky.
Dalším častým problémem jsou oprávnění k přístupu. Pokud se program pokouší číst nebo zapisovat do složky, ke které nemá dostatečná práva, Python vyhodí výjimku PermissionError. Tato situace je obzvláště běžná na systémech Linux nebo macOS, kde jsou přístupová práva striktněji vymáhána. Zachycení této výjimky a patřičná reakce na ni může být rozdílem mezi programem, který elegantně informuje uživatele o problému, a programem, který se bez varování zhroutí.
Při mazání složek, například pomocí shutil.rmtree(), může dojít k celé řadě problémů. Složka může být zamčena jiným procesem, může obsahovat soubory, ke kterým nemáme právo, nebo může být v průběhu mazání odstraněna jiným vláknem. Funkce shutil.rmtree() přijímá volitelný parametr onerror, pomocí kterého lze definovat vlastní funkci pro zpracování chyb, jež nastaly během rekurzivního mazání.
Moderní přístup k práci se složkami v Pythonu 3 nabízí modul pathlib, který přináší objektově orientovaný způsob manipulace s cestami a složkami. I zde je však nutné ošetřovat chyby. Metoda Path.mkdir() vyhodí výjimku FileExistsError nebo FileNotFoundError v závislosti na situaci, a proto je vhodné ji volat uvnitř bloku try-except nebo využít parametry exist_ok=True a parents=True.
Velmi důležitým aspektem je také rozlišení mezi různými typy výjimek. Python nabízí hierarchii výjimek, kde například FileNotFoundError a PermissionError jsou podtřídami OSError. To znamená, že pokud chceme zachytit všechny chyby související s operačním systémem najednou, stačí zachytit OSError. Pokud však chceme na různé typy chyb reagovat různě, musíme je zachytávat samostatně ve více blocích except.
Nezanedbatelnou součástí správného ošetření chyb je také logování. Namísto pouhého vypsání chybové zprávy na obrazovku je v produkčním prostředí vhodné chyby zaznamenávat pomocí modulu logging. Díky tomu máme přehled o tom, co se v programu dělo, i zpětně po jeho skončení, a můžeme lépe diagnostikovat problémy, které se vyskytly při práci se složkami.
Správně napsaný kód pro práci s adresáři by tedy měl vždy počítat s tím, že operace může selhat, a měl by na takovou situaci reagovat předvídatelně a srozumitelně, ať už jde o informování uživatele, opakování operace, nebo bezpečné ukončení programu.
Publikováno: 12. 06. 2026
Kategorie: Programování a vývoj