Jak v Pythonu pracovat se složkami rychle a efektivně
- Co je adresář a složka v Pythonu
- Modul os a práce s cestami
- Vytváření nových složek pomocí os.mkdir
- Rekurzivní tvorba adresářů přes os.makedirs
- Výpis obsahu složky metodou os.listdir
- Procházení adresářové struktury funkcí os.walk
- Přejmenování a mazání složek v Pythonu
- Modul pathlib jako moderní alternativa k os
- Zjišťování existence adresáře metodou exists
- Relativní a absolutní cesty v Pythonu
- Práce s dočasnými složkami přes modul tempfile
- Nejčastější chyby při manipulaci s adresáři
Co je adresář a složka v Pythonu
V programování, a zejména v jazyce Python, se velmi často setkáváme s pojmy adresář a složka. Ačkoliv se tyto dva výrazy v běžné mluvě používají jako synonyma, je dobré pochopit, co přesně znamenají a jak s nimi Python pracuje. Adresář je v podstatě kontejner, který slouží k organizaci souborů a dalších adresářů na disku počítače. Složka je pak jen jiné pojmenování pro totéž – jde o grafické znázornění adresáře v prostředí operačního systému, které uživatelům usnadňuje orientaci v souborovém systému.
Když pracujeme s Pythonem, dostáváme do rukou velmi mocné nástroje pro manipulaci s adresáři a složkami. Základním modulem, který Python nabízí pro práci se souborovým systémem, je modul `os`, který je součástí standardní knihovny a nevyžaduje žádnou dodatečnou instalaci. Kromě toho existuje také modernější modul `pathlib`, který byl představen v Pythonu 3.4 a přináší objektově orientovaný přístup k práci s cestami a adresáři.
Adresářová struktura každého operačního systému je hierarchická – to znamená, že adresáře mohou obsahovat jiné adresáře, čímž vzniká stromová struktura. Na vrcholu této struktury stojí takzvaný kořenový adresář, který se na systémech Unix a Linux označuje lomítkem `/`, zatímco na systémech Windows se jedná například o `C:\`. Python dokáže pracovat s adresáři na všech těchto platformách, přičemž se snaží rozdíly mezi operačními systémy co nejvíce smazat.
Každý program spuštěný v Pythonu má svůj takzvaný pracovní adresář, neboli aktuální adresář, ze kterého byl skript spuštěn nebo ve kterém program právě operuje. Tento pracovní adresář je klíčový, protože určuje, jak Python interpretuje relativní cesty k souborům. Pokud tedy v kódu uvedeme pouze název souboru bez úplné cesty, Python ho hledá právě v tomto pracovním adresáři.
Pomocí funkce `os.getcwd()` lze v Pythonu zjistit, jaký je aktuální pracovní adresář. Název funkce pochází z anglického „get current working directory. Tato funkce vrací řetězec obsahující absolutní cestu k aktuálnímu adresáři, což je velmi užitečné zejména při ladění programů nebo při práci se soubory, jejichž umístění není předem jasné.
Pro vytváření nových adresářů Python nabízí funkci `os.mkdir()`, která vytvoří jeden nový adresář, nebo funkci `os.makedirs()`, jež umožňuje vytvořit celou hierarchii adresářů najednou. Rozdíl mezi těmito dvěma funkcemi je zásadní – pokud bychom chtěli vytvořit adresář, jehož nadřazený adresář ještě neexistuje, funkce `os.mkdir()` by skončila chybou, zatímco `os.makedirs()` by celou potřebnou strukturu vytvořila automaticky.
Stejně důležité jako vytváření adresářů je také jejich mazání. K tomu Python poskytuje funkce `os.rmdir()` pro odstranění prázdného adresáře a `shutil.rmtree()` pro odstranění adresáře včetně veškerého jeho obsahu. Je třeba být při mazání adresářů velmi opatrný, protože Python standardně neposkytuje žádný koš – smazané soubory a adresáře jsou pryč nenávratně, pokud není implementováno jiné řešení.
Moderní přístup k práci s adresáři v Pythonu představuje modul `pathlib`, který přináší třídu `Path`. Pomocí objektů třídy `Path` lze pracovat s cestami k souborům a adresářům mnohem intuitivněji a čitelněji než pomocí starého modulu `os`. Například zjištění aktuálního adresáře lze zapsat jako `Path.cwd()`, vytvoření nového adresáře pak jako `Path('novy_adresar').mkdir()`. Tento přístup je považován za moderní a doporučený způsob práce se souborovým systémem v současných verzích Pythonu.
Pochopení rozdílu mezi absolutní a relativní cestou je při práci s adresáři v Pythonu naprosto nezbytné. Absolutní cesta popisuje umístění souboru nebo adresáře od kořenového adresáře, zatímco relativní cesta popisuje umístění ve vztahu k aktuálnímu pracovnímu adresáři. Správné používání těchto dvou typů cest může ušetřit mnoho zbytečných chyb a problémů při vývoji aplikací.
Modul os a práce s cestami
Práce se soubory a adresáři patří k základním dovednostem každého programátora v Pythonu, a právě modul os je tím nástrojem, který nám tuto práci enormně usnadňuje. Tento modul je součástí standardní knihovny Pythonu, takže ho není třeba instalovat zvlášť – stačí ho jednoduše importovat pomocí příkazu import os a okamžitě máme k dispozici desítky užitečných funkcí.
Jednou z nejčastěji používaných funkcí je os.getcwd(), která vrátí aktuální pracovní adresář. To se hodí zejména tehdy, když si nejsme jistí, odkud náš skript právě běží. Výsledkem je řetězec obsahující celou cestu k aktuálnímu adresáři, například /home/uzivatel/projekty na Linuxu nebo C:\Users\uzivatel\projekty na Windows. Právě tato přenositelnost mezi operačními systémy je jednou z největších výhod modulu os – Python se sám postará o správné formátování cest podle operačního systému, na kterém kód běží.
Pokud chceme přejít do jiného adresáře, použijeme funkci os.chdir(), které předáme cestu k cílovému adresáři. Tato funkce funguje podobně jako příkaz cd v příkazové řádce. Je důležité si uvědomit, že změna pracovního adresáře se projeví globálně v celém běžícím procesu, takže pokud ji použijeme uvnitř funkce, ovlivní to i zbytek programu.
Vytváření nových složek je záležitostí funkce os.mkdir(), která vytvoří jeden nový adresář. Pokud potřebujeme vytvořit celou hierarchii složek najednou, sáhneme po os.makedirs(), která vytvoří všechny chybějící meziadresáře v zadané cestě. Například volání os.makedirs(projekty/python/skripty) vytvoří všechny tři složky najednou, pokud neexistují. Velmi praktický parametr exist_ok=True zajistí, že funkce nevyhodí chybu v případě, že adresář již existuje.
Pro výpis obsahu adresáře slouží funkce os.listdir(), která vrátí seznam názvů všech souborů a podsložek v zadaném adresáři. Pokud cestu nezadáme, pracuje s aktuálním adresářem. Výsledkem je prostý seznam řetězců, takže pokud chceme rozlišit, co je soubor a co složka, musíme použít další funkce, například os.path.isfile() nebo os.path.isdir().
A právě podmodul os.path si zaslouží zvláštní pozornost. Obsahuje celou řadu funkcí pro práci s cestami, které jsou nezávislé na operačním systému. Funkce os.path.join() je naprosto nepostradatelná – spojuje části cesty dohromady a automaticky používá správný oddělovač, ať už jsme na Windows, Linuxu nebo macOS. Místo ručního skládání řetězců jako složka + / + soubor.txt je vždy lepší napsat os.path.join(složka, soubor.txt).
Funkce os.path.exists() prověří, zda daná cesta vůbec existuje, a to bez ohledu na to, zda jde o soubor nebo adresář. Funkce os.path.abspath() převede relativní cestu na absolutní, což je velmi užitečné při ladění nebo logování. Pomocí os.path.basename() získáme pouze název souboru bez cesty, zatímco os.path.dirname() vrátí naopak pouze cestu bez názvu souboru.
Mazání adresářů se provádí pomocí os.rmdir(), ale tato funkce funguje pouze na prázdných složkách. Pro smazání celého adresáře včetně jeho obsahu je třeba sáhnout po modulu shutil a jeho funkci shutil.rmtree(). Přejmenování souborů a složek zajišťuje funkce os.rename(), které předáme původní a nový název.
Velmi mocným nástrojem je funkce os.walk(), která rekurzivně prochází celou adresářovou strukturu. Pro každý adresář vrátí trojici obsahující cestu k aktuálnímu adresáři, seznam jeho podsložek a seznam souborů. Díky tomu lze snadno procházet celé stromy adresářů a zpracovávat soubory na libovolné úrovni zanoření, aniž bychom museli psát vlastní rekurzivní funkce.
Při práci s cestami je vždy dobré myslet na přenositelnost kódu. Nikdy bychom neměli natvrdo zapisovat cesty s konkrétními oddělovači, protože to, co funguje na Linuxu, nemusí fungovat na Windows. Modul os a jeho podmodul os.path jsou navrženy přesně tak, aby tyto problémy řešily za nás. Správné používání těchto nástrojů je základem čistého, přenositelného a spolehlivého kódu v Pythonu.
Vytváření nových složek pomocí os.mkdir
Práce se souborovým systémem patří k základním dovednostem každého programátora, který pracuje s Pythonem. Jednou z nejčastějších operací, které budete při psaní skriptů potřebovat, je vytváření nových složek a adresářů. Python k tomuto účelu nabízí několik nástrojů, přičemž tím nejzákladnějším a nejpřímočařejším je funkce os.mkdir(), která je součástí standardní knihovny os.
Než se pustíte do samotného vytváření složek, musíte nejprve tento modul importovat. Stačí na začátek vašeho skriptu napsat import os a máte k dispozici celou sadu nástrojů pro práci se souborovým systémem. Samotné volání funkce os.mkdir() je pak velmi jednoduché — předáte jí cestu k adresáři, který chcete vytvořit, a Python se postará o zbytek. Například zápis os.mkdir(nová_složka) vytvoří nový adresář s názvem nová_složka v aktuálním pracovním adresáři.
Je důležité si uvědomit, jak Python pracuje s cestami. Pokud zadáte pouze název složky bez celé cesty, vytvoří se adresář relativně k aktuálnímu pracovnímu adresáři, který zjistíte pomocí funkce os.getcwd(). Pokud chcete vytvořit složku na konkrétním místě v souborovém systému, musíte zadat absolutní cestu, například os.mkdir(/home/uzivatel/dokumenty/nová_složka) na systémech Linux nebo macOS, případně os.mkdir(C:\\Users\\Uzivatel\\Dokumenty\\nová_složka) na Windows.
Jednou z nejdůležitějších věcí, na které musíte pamatovat při používání os.mkdir(), je to, že tato funkce vytvoří pouze jeden adresář najednou. To znamená, že pokud se pokusíte vytvořit složku uvnitř jiné složky, která ještě neexistuje, Python vyhodí výjimku FileNotFoundError. Pokud tedy chcete vytvořit celou hierarchii adresářů najednou, budete muset sáhnout po funkci os.makedirs(), která zvládne vytvořit i celý strom složek v jednom kroku.
Dalším velmi důležitým aspektem je ošetření chyb. Pokud se pokusíte vytvořit adresář, který již existuje, Python vyhodí výjimku FileExistsError. Proto je dobrým zvykem vždy obalit volání os.mkdir() do bloku try-except, kde tuto výjimku zachytíte a adekvátně na ni zareagujete. Alternativně můžete před voláním os.mkdir() zkontrolovat, zda adresář již existuje, pomocí funkce os.path.exists() nebo os.path.isdir(). Typický vzor vypadá tak, že nejprve ověříte existenci adresáře a teprve pokud neexistuje, zavoláte os.mkdir().
Při práci se složkami v Pythonu byste měli také myslet na přenositelnost kódu mezi různými operačními systémy. Různé systémy používají různé oddělovače cest — Windows používá zpětné lomítko, zatímco Linux a macOS používají dopředné lomítko. Aby byl váš kód přenositelný, doporučuje se používat os.path.join() pro sestavování cest, místo abyste ručně psali oddělovače. Tato funkce automaticky použije správný oddělovač pro daný operační systém.
Funkce os.mkdir() také přijímá volitelný parametr mode, který určuje oprávnění nově vytvořeného adresáře. Tento parametr je relevantní především na unixových systémech, kde můžete nastavit, kdo má právo číst, zapisovat nebo spouštět obsah adresáře. Výchozí hodnota je obvykle 0o777, ale skutečná oprávnění jsou ovlivněna také hodnotou umask daného systému.
Celkově lze říci, že os.mkdir() je jednoduchá, ale mocná funkce, která vám umožní efektivně spravovat adresářovou strukturu vašich projektů přímo z Pythonu. Ať už píšete skripty pro automatizaci, zpracování dat nebo správu souborů, znalost práce s touto funkcí vám výrazně usnadní každodenní programátorskou práci a umožní vám vytvářet robustní a spolehlivé aplikace, které správně pracují se souborovým systémem na jakémkoli operačním systému.
Rekurzivní tvorba adresářů přes os.makedirs
Při práci se souborovým systémem v Pythonu se velmi často setkáváme se situací, kdy potřebujeme vytvořit nejen jednu složku, ale celou hierarchii adresářů najednou. Právě pro tyto účely existuje funkce os.makedirs(), která představuje výkonnější alternativu k základnímu os.mkdir(). Zatímco os.mkdir() dokáže vytvořit pouze jeden adresář a selže, pokud nadřazené složky neexistují, os.makedirs() je navržena tak, aby celou cestu vytvořila rekurzivně, tedy od nejvyšší úrovně až po tu nejhlubší.
Představme si konkrétní příklad. Chceme vytvořit strukturu jako projekty/python/skripty/pomocne. Pokud by žádná z těchto složek neexistovala, os.mkdir() by okamžitě vyhodila výjimku a celá operace by selhala. Naproti tomu os.makedirs(projekty/python/skripty/pomocne) projde celou cestou a postupně vytvoří každý chybějící adresář. To je nesmírně praktické při automatizaci, generování projektových šablon nebo při práci s dynamicky generovanými cestami.
Důležitým parametrem, který byste při používání os.makedirs() rozhodně neměli přehlédnout, je exist_ok. Standardně, pokud cílový adresář již existuje, funkce vyhodí výjimku FileExistsError. Nastavením exist_ok=True tomuto chování zabráníte a funkce jednoduše nic neudělá, pokud složka již existuje. Toto chování je v praxi velmi žádoucí, protože skripty bývají spouštěny opakovaně a kontrolovat existenci každého adresáře manuálně by bylo zbytečně zdlouhavé.
Použití vypadá v praxi takto:
import os
os.makedirs(projekty/python/skripty/pomocne, exist_ok=True)
Tento jednoduchý řádek kódu zajistí, že celá adresářová struktura bude vytvořena bez ohledu na to, zda některé části již existují nebo ne. Není potřeba psát žádné podmínky, žádné try-except bloky pro zachytávání výjimek spojených s existencí složek.
Dalším aspektem, který stojí za zmínku, je parametr mode, jenž umožňuje nastavit přístupová oprávnění pro nově vytvářené adresáře. Na systémech Unix a Linux je tento parametr skutečně funkční, zatímco na Windows je z velké části ignorován, protože Windows používá jiný model oprávnění. Výchozí hodnota je 0o777, což znamená plná oprávnění pro čtení, zápis i spouštění, přičemž výsledná oprávnění jsou ovlivněna hodnotou umask daného procesu.
Je také dobré vědět, jak se os.makedirs() chová při chybách uprostřed cesty. Pokud například nemáte oprávnění vytvořit jeden z mezilehlých adresářů, funkce vyhodí PermissionError a žádné z adresářů vytvořených před tímto bodem nebudou automaticky odstraněny. To může v některých situacích vést k neúplné adresářové struktuře, na což je třeba myslet při psaní robustního kódu.
Pro maximální přenositelnost mezi různými operačními systémy je doporučeno kombinovat os.makedirs() s modulem os.path, konkrétně s funkcí os.path.join(), která správně sestaví cestu podle konvencí daného systému. Například na Windows se jako oddělovač používá zpětné lomítko, zatímco na Linuxu lomítko dopředu. Funkce os.path.join() tento rozdíl řeší automaticky a váš kód pak funguje spolehlivě na všech platformách.
V moderním Pythonu, konkrétně od verze 3.4, existuje také alternativa v podobě modulu pathlib, který nabízí objektově orientovaný přístup k práci se souborovým systémem. Třída Path a její metoda mkdir(parents=True, exist_ok=True) dělá přesně totéž co os.makedirs() s exist_ok=True, ale syntaxe je čitelnější a intuitivnější. Přesto os.makedirs() zůstává velmi rozšířenou a oblíbenou volbou, zejména v starším kódu nebo tam, kde vývojáři preferují funkcionální přístup.
Celkově lze říci, že os.makedirs() je jedním z nejužitečnějších nástrojů pro práci s adresáři v Pythonu. Její schopnost rekurzivně vytvářet celé adresářové stromy jedním voláním šetří čas, zjednodušuje kód a snižuje riziko chyb. Každý, kdo v Pythonu pracuje se souborovým systémem pravidelně, by měl tuto funkci znát a umět ji správně použít včetně všech jejích parametrů.
Složka pojmenovaná Python leží na ploše jako had stočený ve spánku – nikdo neví, co ukrývá, dokud ji neotevře a nenechá se kousnout chaosem souborů uvnitř.
Radovan Šimánek
Výpis obsahu složky metodou os.listdir
Práce se soubory a složkami patří k základním dovednostem každého programátora, který se věnuje Pythonu. Jednou z nejpoužívanějších metod pro získání přehledu o obsahu adresáře je funkce os.listdir(), která je součástí standardního modulu os. Tento modul nabízí celou řadu nástrojů pro interakci s operačním systémem a práci se souborovým systémem, přičemž os.listdir() je jednou z nejjednodušších a nejpřímočařejších funkcí, které máte k dispozici.
Aby bylo možné tuto funkci vůbec použít, je nutné nejprve modul os importovat. To se provede jednoduše pomocí příkazu import os na začátku skriptu. Bez tohoto importu by Python funkci os.listdir() vůbec neznal a skript by skončil chybou. Jakmile je modul importován, můžete funkci volat a předat jí cestu ke složce, jejíž obsah chcete vypsat.
Funkce os.listdir() přijímá jako argument cestu k adresáři, který chcete prozkoumat. Tato cesta může být absolutní, tedy například /home/uzivatel/dokumenty na Linuxu nebo C:\\Users\\Uzivatel\\Dokumenty na Windows, nebo relativní, kdy zadáváte cestu vzhledem k aktuálnímu pracovnímu adresáři. Pokud funkci zavoláte bez argumentu nebo s argumentem '.', vrátí obsah aktuálního pracovního adresáře, ve kterém se skript právě nachází.
Výsledkem volání os.listdir() je seznam řetězců, kde každý řetězec představuje název jednoho souboru nebo podsložky v daném adresáři. Důležité je si uvědomit, že funkce vrací pouze názvy, nikoli úplné cesty. Pokud tedy chcete pracovat se soubory dále, například je otevírat nebo zjišťovat jejich vlastnosti, musíte cestu k adresáři a název souboru spojit dohromady. K tomu se skvěle hodí funkce os.path.join(), která správně sestaví cestu bez ohledu na operační systém.
Dalším důležitým aspektem, který je třeba mít na paměti, je to, že os.listdir() nerozlišuje mezi soubory a složkami. Vrátí prostě vše, co se v daném adresáři nachází, tedy soubory, podsložky, symbolické odkazy i skryté soubory, jejichž název začíná tečkou na unixových systémech. Pokud chcete filtrovat výsledky a pracovat pouze se soubory nebo pouze se složkami, musíte použít doplňkové funkce jako os.path.isfile() nebo os.path.isdir(), které vrací pravdivostní hodnotu podle toho, zda je daná položka souborem nebo adresářem.
Praktické využití os.listdir() je velmi široké. Můžete ji použít například k automatickému zpracování všech souborů v určité složce, k vytvoření zálohovacího skriptu, k analýze struktury adresářů nebo k vyhledávání souborů s určitou příponou. Pokud například chcete projít všechny soubory s příponou .txt v dané složce, stačí výsledný seznam projít pomocí cyklu for a každý název zkontrolovat metodou endswith().
Je také dobré vědět, že os.listdir() neprochází adresáře rekurzivně. To znamená, že pokud složka obsahuje podsložky, jejich obsah se do výsledného seznamu nezahrne. Zobrazí se pouze samotné názvy podsložek jako položky v seznamu. Pokud potřebujete procházet celý strom adresářů včetně všech podsložek, je vhodnější sáhnout po funkci os.walk(), která rekurzivně prochází celou strukturu adresářů a pro každou úroveň vrací trojici obsahující cestu k adresáři, seznam jeho podsložek a seznam souborů.
Přestože os.listdir() je velmi užitečná, v moderním Pythonu existuje i alternativa v podobě modulu pathlib, který nabízí objektově orientovaný přístup k práci se souborovým systémem. Metoda Path.iterdir() z tohoto modulu plní podobnou funkci jako os.listdir(), ale vrací objekty typu Path, se kterými se pracuje pohodlněji a intuitivněji. I přesto os.listdir() zůstává velmi populární, zejména u programátorů, kteří jsou zvyklí na starší styl práce nebo kteří pracují s kódem, kde je konzistence s existujícím stylem důležitá.
Celkově lze říci, že os.listdir() je základní a spolehlivý nástroj pro výpis obsahu složky v Pythonu, který zvládne každý začátečník i zkušený vývojář. Pochopení jejího fungování a správné použití v kombinaci s dalšími funkcemi modulu os tvoří pevný základ pro efektivní práci se souborovým systémem v jakémkoli Python projektu.
Procházení adresářové struktury funkcí os.walk
Funkce os.walk patří mezi nejužitečnější nástroje, které Python nabízí pro práci s adresářovou strukturou. Umožňuje rekurzivně procházet celý strom složek a souborů, přičemž vývojáři poskytuje přehledný a snadno použitelný způsob, jak se dostat ke každé složce a každému souboru v dané hierarchii. Pokud jste někdy potřebovali projít celý disk nebo konkrétní složku a zpracovat všechny soubory, které se v ní nacházejí, pak je právě tato funkce to, co hledáte.
Základní princip fungování os.walk spočívá v tom, že funkce generuje trojici hodnot pro každý adresář, na který při procházení narazí. Tato trojice obsahuje cestu k aktuálnímu adresáři, seznam podadresářů nacházejících se v tomto adresáři a seznam souborů, které jsou v daném adresáři přítomny. Celý proces probíhá automaticky a rekurzivně, takže se vývojář nemusí starat o to, jak hluboko stromová struktura sahá.
Praktické použití vypadá velmi jednoduše. Stačí importovat modul os a zavolat funkci os.walk s cestou k výchozímu adresáři jako argumentem. Výsledkem je generátor, přes který lze iterovat pomocí cyklu for. V každé iteraci dostanete zmíněnou trojici, kde první prvek je řetězec s cestou k aktuálnímu adresáři, druhý prvek je seznam názvů podadresářů a třetí prvek je seznam názvů souborů. Tato struktura je intuitivní a práce s ní je velmi přímočará.
Jednou z důležitých vlastností funkce os.walk je parametr topdown, který určuje směr procházení. Pokud je nastaven na hodnotu True, což je výchozí nastavení, procházení začíná od kořenového adresáře směrem dolů k listovým uzlům. Pokud je nastaven na False, procházení probíhá opačně, tedy od nejhlubších adresářů směrem ke kořeni. Toto nastavení může být velmi užitečné v situacích, kdy potřebujete nejprve zpracovat obsah podsložek a teprve poté jejich nadřazené adresáře.
Dalším parametrem je onerror, který umožňuje definovat vlastní funkci pro zpracování chyb, jež mohou nastat při přístupu k určitým adresářům. To je obzvláště důležité v prostředích, kde nemáte přístupová práva ke všem složkám. Bez tohoto parametru by funkce chyby jednoduše ignorovala, což může vést k neúplnému procházení adresářové struktury.
Parametr followlinks je dalším zajímavým nastavením, které řídí, zda má funkce následovat symbolické odkazy na adresáře. Ve výchozím stavu je nastaven na False, což znamená, že symbolické odkazy nejsou sledovány. Pokud jej nastavíte na True, funkce bude symbolické odkazy sledovat, ale musíte být opatrní, protože to může vést k nekonečným smyčkám v případě cyklických odkazů.
Při práci s os.walk je velmi časté kombinovat tuto funkci s modulem os.path, konkrétně s funkcí os.path.join, která umožňuje správně sestavit úplnou cestu k souboru nebo adresáři. Samotný název souboru totiž neobsahuje informaci o tom, kde se nachází, a proto je nutné jej spojit s cestou k adresáři, ve kterém leží. Výsledná cesta pak může být použita pro čtení souboru, jeho přejmenování, mazání nebo jakoukoliv jinou operaci.
Velmi praktickým příkladem využití os.walk je hledání souborů s určitou příponou v celé adresářové struktuře. Stačí při iteraci kontrolovat, zda název souboru končí požadovanou příponou, a pokud ano, přidat celou cestu k souboru do výsledného seznamu. Tento přístup je mnohem elegantnější než ruční rekurzivní procházení složek a psaní vlastní logiky pro správu zásobníku adresářů.
Funkce os.walk je také velmi užitečná při synchronizaci adresářů, zálohování souborů nebo při analýze obsahu disku. Díky tomu, že poskytuje kompletní přehled o celé adresářové struktuře, lze snadno zjistit, kolik souborů a složek se nachází v daném umístění, jaká je celková velikost všech souborů nebo které soubory byly naposledy upraveny. Tato funkce je skutečně jedním ze základních stavebních kamenů pro každého, kdo v Pythonu pracuje se souborovým systémem a potřebuje efektivně spravovat adresářové struktury.
Přejmenování a mazání složek v Pythonu
Práce se souborovým systémem je v Pythonu velmi přímočará a elegantní záležitost, přičemž přejmenování a mazání složek patří mezi operace, které vývojáři potřebují poměrně často. Python nabízí hned několik způsobů, jak tyto úkoly provést, a každý z nich má své výhody i specifika, na která je dobré myslet předem.
| Vlastnost | os modul | pathlib modul | shutil modul |
|---|---|---|---|
| Dostupnost od verze Pythonu | Python 1.x | Python 3.4 | Python 2.x |
| Vytvoření adresáře | os.mkdir() | Path.mkdir() | není přímá podpora |
| Smazání adresáře | os.rmdir() | Path.rmdir() | shutil.rmtree() |
| Výpis obsahu složky | os.listdir() | Path.iterdir() | není přímá podpora |
| Kopírování složky | není přímá podpora | není přímá podpora | shutil.copytree() |
| Přesun složky | os.rename() | Path.rename() | shutil.move() |
| Objektově orientovaný přístup | Ne | Ano | Ne |
| Rekurzivní vytvoření adresářů | os.makedirs() | Path.mkdir(parents=True) | není přímá podpora |
| Zjištění aktuální složky | os.getcwd() | Path.cwd() | není přímá podpora |
| Multiplatformní podpora | Ano | Ano | Ano |
Nejzákladnějším nástrojem pro práci s adresáři je modul os, který je součástí standardní knihovny Pythonu. Pro přejmenování složky slouží funkce os.rename(), která přijímá dva argumenty — původní název adresáře a nový název. Použití je jednoduché: pokud máme složku s názvem stara_slozka a chceme ji přejmenovat na nova_slozka, stačí napsat os.rename(stara_slozka, nova_slozka). Tato funkce funguje nejen pro přejmenování, ale lze ji využít i pro přesun adresáře na jiné místo v souborovém systému, pokud zadáme úplnou cestu. Je důležité vědět, že pokud cílová složka již existuje, chování se liší podle operačního systému — na Unixových systémech dojde k přepsání, zatímco na Windows to může vyvolat výjimku.
Modernějším a doporučovanějším přístupem je použití modulu pathlib, který byl představen v Pythonu 3.4 a přináší objektově orientovaný přístup k práci se souborovým systémem. Pomocí třídy Path a její metody rename() lze dosáhnout stejného výsledku, ale kód je čitelnější a lépe přenositelný mezi různými operačními systémy. Například: Path(stara_slozka).rename(nova_slozka) provede přejmenování bez nutnosti importovat modul os zvlášť. Metoda replace() z modulu pathlib pak funguje podobně, ale na rozdíl od rename() přepíše cílový adresář i na Windows, pokud existuje.
Co se týče mazání složek, situace je o něco složitější. Prázdnou složku lze smazat pomocí funkce os.rmdir() nebo metodou Path.rmdir(). Obě tyto možnosti však fungují pouze tehdy, pokud je adresář skutečně prázdný — pokud obsahuje jakékoli soubory nebo podsložky, vyvolají výjimku OSError. To je záměrné chování, které chrání uživatele před nechtěným smazáním důležitých dat.
Pro smazání celého adresářového stromu včetně veškerého obsahu je nutné sáhnout po modulu shutil a jeho funkci shutil.rmtree(). Tato funkce rekurzivně smaže zadaný adresář i vše, co se v něm nachází. Je to velmi mocný nástroj, ale také nebezpečný — smazané soubory a složky se nepřesouvají do koše, ale jsou odstraněny natrvalo. Proto je vždy rozumné před voláním této funkce ověřit, zda zadaná cesta skutečně ukazuje na správný adresář.
Při práci s přejmenováváním a mazáním složek je dobrou praxí ošetřovat výjimky pomocí bloků try-except. Nejčastějšími výjimkami, se kterými se vývojář setká, jsou FileNotFoundError, pokud zadaná složka neexistuje, PermissionError, pokud nemá program dostatečná oprávnění, a OSError v různých dalších situacích. Správné ošetření těchto výjimek zabrání pádu programu a umožní uživateli srozumitelně informovat o tom, co se pokazilo.
Dalším důležitým aspektem je práce s relativními a absolutními cestami. Relativní cesty jsou vztaženy k aktuálnímu pracovnímu adresáři, který lze zjistit pomocí os.getcwd() nebo Path.cwd(). Absolutní cesty začínají kořenem souborového systému a jsou jednoznačné bez ohledu na to, odkud je program spuštěn. Pro produkční kód je obecně bezpečnější používat absolutní cesty, protože eliminují nejasnosti a potenciální chyby způsobené neočekávanou změnou pracovního adresáře.
Pokud vývojář potřebuje přejmenovat více složek najednou, může kombinovat funkci os.listdir() nebo Path.iterdir() s cyklem a podmínkami. Takový přístup umožňuje například hromadně přejmenovat všechny složky v daném adresáři podle určitého vzoru, přidat prefix nebo suffix k jejich názvům, nebo je seřadit a přečíslovat. Právě tato flexibilita dělá z Pythonu skvělý nástroj pro automatizaci správy souborového systému, ať už jde o jednoduché přejmenování nebo složité reorganizace celých adresářových struktur.
Modul pathlib jako moderní alternativa k os
Od verze 3.4 přinesl Python do standardní knihovny modul pathlib, který zásadně změnil způsob, jakým vývojáři pracují se souborovým systémem. Zatímco starší přístup pomocí modulu os a os.path fungoval spolehlivě, byl poměrně těžkopádný a vyžadoval řetězení mnoha volání funkcí. Pathlib přišel s objektově orientovaným přístupem, který je intuitivnější a čitelnější.
Základním stavebním kamenem celého modulu je třída Path. Jakmile vytvoříte instanci této třídy, získáte objekt, který v sobě zapouzdřuje veškerou logiku pro práci s cestami a adresáři. Například pro získání aktuálního pracovního adresáře stačí napsat Path.cwd(), zatímco ve starém přístupu bylo nutné volat os.getcwd(). Na první pohled se může zdát, že jde jen o kosmetickou změnu, ale rozdíl je mnohem hlubší.
Jednou z největších výhod pathlibu je možnost skládat cesty pomocí operátoru /. Pokud chcete v tradičním přístupu spojit cestu k adresáři s názvem podsložky, musíte použít os.path.join(), což při více úrovních zanořování vede k nepřehledným řetězcům volání. S pathlib jednoduše napíšete Path('/home/uzivatel') / 'dokumenty' / 'projekt' a výsledek je okamžitě čitelný. Tato syntaxe je přirozená a odpovídá tomu, jak o cestách přemýšlíme v běžném životě.
Práce s adresáři a složkami je v pathlib výrazně zjednodušena. Metoda mkdir() umožňuje vytvořit nový adresář, přičemž parametr parents=True zajistí, že se vytvoří i všechny nadřazené adresáře, pokud neexistují. Parametr exist_ok=True pak zabrání vyvolání výjimky v případě, že adresář již existuje. Toto chování nahrazuje kombinaci podmínek a volání os.makedirs(), které bylo nutné obalit blokem try-except.
Procházení obsahu adresáře je s pathlib také elegantnější. Metoda iterdir() vrací iterátor přes všechny položky v daném adresáři, a to jako objekty Path, s nimiž lze okamžitě pracovat dál. Pokud hledáte soubory odpovídající určitému vzoru, metoda glob() a rglob() nabízejí mocné nástroje pro rekurzivní prohledávání celé stromové struktury adresářů. Například Path('.').rglob('*.py') najde všechny Python soubory v aktuálním adresáři a všech jeho podsložkách.
Pathlib také poskytuje řadu užitečných atributů a metod pro práci s vlastnostmi cesty. Atribut name vrátí název souboru nebo adresáře, stem vrátí název bez přípony a suffix vrátí samotnou příponu. Atribut parent pak vrátí nadřazený adresář jako nový objekt Path, což umožňuje snadno navigovat v hierarchii složek. Pro ověření existence adresáře slouží metoda exists(), pro ověření, zda jde skutečně o adresář, pak is_dir().
Důležitým aspektem je také přenositelnost kódu mezi různými operačními systémy. Pathlib automaticky rozlišuje mezi PosixPath pro systémy Unix a Linux a WindowsPath pro Windows, přičemž vývojář nemusí tuto logiku řešit sám. Výsledný kód tak funguje správně na všech platformách bez nutnosti podmíněných větví.
Přechod z modulu os na pathlib nemusí být radikální skok. Oba přístupy lze v kódu kombinovat, protože většina funkcí z modulu os akceptuje objekty Path stejně jako řetězce. Postupná migrace je tedy zcela reálná a doporučovaná, zejména u větších projektů, kde se práce s adresáři a souborovým systémem opakuje na mnoha místech. Moderní Python kód by měl pathlib preferovat jako výchozí volbu, protože přináší čistší, bezpečnější a lépe čitelný způsob práce se souborovým systémem.
Zjišťování existence adresáře metodou exists
V Pythonu existuje několik způsobů, jak zjistit, zda určitý adresář nebo složka na disku skutečně existuje, a jedním z nejpoužívanějších a nejpřehlednějších způsobů je využití metody exists() z modulu os.path. Tato metoda je součástí standardní knihovny Pythonu, takže ji není třeba instalovat žádným externím nástrojem – stačí ji jednoduše importovat a okamžitě začít používat.
Základní princip fungování metody exists() je poměrně přímočarý. Metodě předáte cestu k adresáři nebo souboru jako řetězec, a ona vrátí buď hodnotu True, pokud daná cesta existuje, nebo hodnotu False, pokud neexistuje. Důležité je si uvědomit, že metoda exists() nekontroluje pouze adresáře, ale obecně jakoukoliv cestu v souborovém systému – tedy i soubory samotné. Pokud chcete ověřit, zda jde konkrétně o adresář a nikoliv o soubor, je vhodné kombinovat exists() s metodou os.path.isdir(), která vrátí True pouze tehdy, když daná cesta skutečně odkazuje na složku.
Použití v praxi je velmi jednoduché. Na začátku skriptu je nutné importovat modul os nebo přímo os.path, a poté zavolat funkci s příslušnou cestou. Například import os a následně os.path.exists(/cesta/k/adresari) vrátí odpovídající logickou hodnotu. Tuto hodnotu pak lze využít v podmínce if, kde se rozhodne, jaký krok program provede dál – zda adresář vytvoří, přeskočí zpracování nebo uživatele informuje o chybě.
Jednou z nejčastějších situací, kdy se tato metoda hodí, je dynamické vytváření adresářů v průběhu běhu programu. Představte si skript, který zpracovává data a ukládá výsledky do konkrétní složky. Pokud by složka neexistovala a program by se pokusil do ní zapisovat, skončilo by to chybou. Proto je dobrým zvykem nejprve zkontrolovat existenci adresáře pomocí exists() a teprve poté přistoupit k zápisu nebo vytvoření nové složky pomocí os.makedirs().
Je také důležité zmínit, že metoda exists() pracuje jak s absolutními, tak s relativními cestami. Absolutní cesta začíná od kořenového adresáře souborového systému, zatímco relativní cesta je vztažena k aktuálnímu pracovnímu adresáři, ve kterém je skript spuštěn. Pokud si nejste jisti, kde se váš skript nachází, doporučuje se použít funkci os.getcwd(), která vrátí aktuální pracovní adresář, a cestu k adresáři pak sestavit pomocí os.path.join(), čímž zajistíte přenositelnost kódu mezi různými operačními systémy.
Dalším aspektem, který stojí za zmínku, je chování metody exists() při práci se symbolickými odkazy. Pokud symbolický odkaz existuje, ale odkazuje na neexistující cíl, metoda exists() vrátí False. Toto chování může být v některých situacích překvapivé, proto je dobré mít na paměti, že exists() ověřuje skutečnou dostupnost cíle, nikoliv jen přítomnost samotného odkazu v souborovém systému.
V moderním Pythonu, konkrétně od verze 3.4, je k dispozici také modul pathlib, který nabízí objektově orientovaný přístup k práci se souborovým systémem. Třída Path z tohoto modulu také obsahuje metodu exists(), která funguje na stejném principu jako os.path.exists(), ale syntaxe je o něco čitelnější a intuitivnější. Například from pathlib import Path a poté Path(/cesta/k/adresari).exists() provede totéž, co klasický přístup přes os.path. Volba mezi těmito dvěma přístupy závisí na osobních preferencích programátora a na tom, jaký styl kódu je v daném projektu preferován.
Celkově lze říci, že zjišťování existence adresáře pomocí metody exists() patří mezi základní dovednosti každého Python programátora, který pracuje se souborovým systémem. Správné použití této metody pomáhá předcházet zbytečným chybám, zvyšuje robustnost kódu a přispívá k tomu, že programy fungují spolehlivě i v různých prostředích a na různých operačních systémech.
Relativní a absolutní cesty v Pythonu
Práce se soubory a adresáři je v Pythonu každodenní záležitostí, a právě proto je důležité rozumět rozdílu mezi relativními a absolutními cestami. Každý, kdo někdy psal skript pro zpracování souborů, se s tímto tématem setkal, ať už vědomě nebo nevědomě. Pojďme si tedy důkladně vysvětlit, jak to celé funguje a proč na tom záleží.
Když mluvíme o absolutní cestě, máme na mysli úplnou cestu k souboru nebo adresáři, která začíná od kořenového adresáře systému. Na operačním systému Linux nebo macOS to znamená, že cesta začíná lomítkem, například /home/uzivatel/dokumenty/projekt/skript.py. Na Windows pak absolutní cesta začíná písmenem disku, například C:\Users\uzivatel\dokumenty\projekt\skript.py. Absolutní cesta je jednoznačná a nezávisí na tom, ze které složky váš Python skript spouštíte. To je její největší výhoda, ale zároveň i nevýhoda – pokud projekt přesunete na jiný počítač nebo do jiného adresáře, absolutní cesty přestanou fungovat.
Na druhé straně stojí relativní cesta, která vychází z aktuálního pracovního adresáře. Aktuální pracovní adresář je ten, ze kterého byl skript spuštěn, nikoliv nutně ten, ve kterém se skript fyzicky nachází. To je velmi důležité rozlišení, které začátečníky často mate. Pokud máte skript v adresáři /home/uzivatel/projekt a spustíte ho z adresáře /home/uzivatel, pak relativní cesta data/soubor.txt bude odkazovat na /home/uzivatel/data/soubor.txt, nikoliv na /home/uzivatel/projekt/data/soubor.txt.
Python nabízí několik způsobů, jak zjistit a pracovat s aktuálním pracovním adresářem. Nejčastěji se používá modul os nebo modernější modul pathlib. Pomocí os.getcwd() získáte aktuální pracovní adresář jako řetězec. Pokud chcete pracovní adresář změnit, použijete os.chdir() s cestou k požadovanému adresáři. Tato funkce je velmi užitečná, ale je třeba s ní zacházet opatrně, protože změna pracovního adresáře ovlivní celý běh programu.
Modul pathlib, který byl představen v Pythonu 3.4, přinesl objektově orientovaný přístup k práci s cestami. Třída Path z tohoto modulu umožňuje elegantně pracovat jak s relativními, tak s absolutními cestami. Například Path.cwd() vrátí aktuální pracovní adresář jako objekt Path, a metoda resolve() převede relativní cestu na absolutní. To je nesmírně praktické, protože se nemusíte starat o rozdíly mezi operačními systémy – pathlib si poradí s lomítky i zpětnými lomítky automaticky.
Velmi častým problémem v praxi je situace, kdy chcete přistupovat k souborům relativně vůči umístění samotného skriptu, nikoliv vůči pracovnímu adresáři. K tomu slouží proměnná __file__, která obsahuje cestu k aktuálně spuštěnému souboru. Kombinací Path(__file__).parent získáte adresář, ve kterém se skript nachází, a od toho pak můžete stavět relativní cesty. Tato technika je velmi oblíbená a doporučovaná, protože zajistí, že váš skript bude fungovat správně bez ohledu na to, odkud ho spustíte.
Při práci s cestami v Pythonu byste se měli vyvarovat ručního skládání cest pomocí řetězcové konkatenace. Místo psaní cesta + / + soubor použijte raději os.path.join() nebo operátor / v případě pathlib. Tyto nástroje automaticky zajistí správné oddělovače pro daný operační systém a váš kód bude přenositelný.
Je také dobré vědět, že Python při importu modulů prohledává adresáře definované v sys.path. Tato proměnná obsahuje seznam absolutních cest, ve kterých Python hledá moduly. Aktuální pracovní adresář bývá obvykle součástí tohoto seznamu, ale není to pravidlem, a proto se na to nelze vždy spoléhat.
Závěrem je třeba říct, že pochopení rozdílu mezi relativními a absolutními cestami je základním předpokladem pro psaní spolehlivého kódu v Pythonu. Zkušení programátoři zpravidla preferují práci s absolutními cestami odvozenými od umístění skriptu, protože takový kód je předvídatelný a snadno přenositelný mezi různými prostředími. Ať už se rozhodnete pro jakýkoliv přístup, vždy si uvědomte, od čeho se vaše cesty odvíjejí – ušetříte si tím hodiny ladění záhadných chyb.
Práce s dočasnými složkami přes modul tempfile
Při vývoji softwaru v Pythonu se vývojáři velmi často setkávají se situací, kdy potřebují pracovat s dočasnými daty, která mají sloužit jen po dobu běhu programu nebo konkrétní operace. K tomuto účelu Python nabízí standardní modul tempfile, který poskytuje pohodlné a bezpečné nástroje pro vytváření dočasných souborů a složek. Tento modul je součástí standardní knihovny, takže není potřeba instalovat žádné externí závislosti, stačí jej jednoduše importovat příkazem import tempfile.
Nejčastěji používanou funkcí pro práci s dočasnými adresáři je tempfile.mkdtemp(). Tato funkce vytvoří dočasnou složku na disku a vrátí cestu k ní jako řetězec. Důležité je si uvědomit, že tato složka není automaticky smazána po skončení programu, a proto je nutné se o její úklid postarat manuálně, například pomocí modulu shutil a jeho funkce shutil.rmtree(). Pokud na úklid zapomenete, dočasná složka zůstane na disku a může zbytečně zabírat místo, což je v produkčním prostředí nežádoucí chování.
Elegantnějším přístupem je použití kontextového manažeru tempfile.TemporaryDirectory(). Tento přístup zajistí, že dočasná složka bude automaticky smazána ihned po opuštění bloku with, a to i v případě, že dojde k výjimce. Syntaxe vypadá takto: pomocí příkazu with tempfile.TemporaryDirectory() as tmpdir: získáte proměnnou tmpdir, která obsahuje cestu k nově vytvořené dočasné složce. Uvnitř tohoto bloku můžete s adresářem pracovat naprosto standardním způsobem, vytvářet v něm soubory, podsložky nebo provádět jakékoliv jiné operace se souborovým systémem.
Modul tempfile při vytváření dočasných složek standardně používá systémový adresář pro dočasné soubory, který je na Linuxu typicky /tmp, na Windows pak složka definovaná proměnnou prostředí TEMP nebo TMP. Toto výchozí chování lze změnit pomocí parametru dir, kde explicitně určíte, v jakém nadřazeném adresáři má být dočasná složka vytvořena. Dalšími užitečnými parametry jsou prefix a suffix, které umožňují přizpůsobit název dočasné složky, což se hodí například při ladění aplikace, kdy chcete snadno identifikovat, které dočasné adresáře patří k vašemu programu.
Při práci s dočasnými složkami v Pythonu je vhodné kombinovat modul tempfile s modulem os nebo pathlib. Modul os nabízí funkce jako os.path.join() pro skládání cest nebo os.makedirs() pro vytváření vnořených adresářů uvnitř dočasné složky. Moderní alternativou je pak třída pathlib.Path, která umožňuje pracovat s cestami objektově orientovaným způsobem a mnohým vývojářům přijde intuitivnější než klasické řetězcové operace.
Je důležité zmínit, že dočasné složky vytvořené modulem tempfile mají nastavena přístupová práva tak, aby k nim měl přístup pouze aktuální uživatel. To je z bezpečnostního hlediska velmi důležité, protože dočasné složky mohou obsahovat citlivá data, jako jsou mezivýsledky výpočtů, dočasné kopie souborů nebo exportovaná data. Bezpečnostní aspekt je jedním z hlavních důvodů, proč byste měli vždy preferovat modul tempfile před manuálním vytvářením dočasných adresářů pomocí pevně zadaných cest jako například /tmp/moje_aplikace_temp.
V praxi se dočasné složky hodí v mnoha situacích. Například při testování, kdy potřebujete izolované prostředí pro každý testovací případ, při zpracování nahraných souborů ve webové aplikaci, při kompilaci nebo transformaci dat, nebo při práci s archivy, které je potřeba nejprve rozbalit, zpracovat a poté smazat. Ve všech těchto případech vám tempfile.TemporaryDirectory() ušetří spoustu starostí a zajistí čistý stav systému po dokončení operace.
Celkově lze říci, že modul tempfile je jedním z těch nástrojů, které sice nejsou na první pohled nijak okázalé, ale v každodenní práci s Pythonem jsou naprosto nepostradatelné. Správné používání dočasných složek přispívá k čistotě kódu, bezpečnosti aplikace a předchází zbytečnému znečišťování souborového systému.
Nejčastější chyby při manipulaci s adresáři
Práce s adresáři v Pythonu může na první pohled vypadat jako jednoduchá záležitost, ale v praxi se programátoři, ať už začátečníci nebo zkušení vývojáři, velmi často dopouštějí chyb, které mohou způsobit vážné problémy. Jednou z nejrozšířenějších chyb je nesprávné skládání cest k adresářům pomocí prostého řetězení stringů. Mnoho lidí jednoduše napíše něco jako `cesta = /home/uzivatel + /dokumenty` a přitom vůbec nepomyslí na to, že na různých operačních systémech se oddělovač adresářů liší. Na Windows se používá zpětné lomítko, zatímco na Linuxu a macOS lomítko dopředné. Právě proto existuje modul `os.path` a v modernějším Pythonu pak modul `pathlib`, které tento problém elegantně řeší. Funkce `os.path.join()` automaticky použije správný oddělovač podle aktuálního operačního systému, a proto by ji měl každý vývojář používat místo ručního skládání cest.
Další velmi častou chybou je předpoklad, že adresář existuje, aniž by to bylo ověřeno. Pokud se pokusíte otevřít soubor v adresáři, který neexistuje, Python vyhodí výjimku `FileNotFoundError`. Správný přístup je před jakoukoli operací zkontrolovat existenci adresáře pomocí `os.path.exists()` nebo `os.path.isdir()`. Ještě lepší je pak využít `os.makedirs()` s parametrem `exist_ok=True`, který adresář vytvoří, pokud neexistuje, a zároveň nevyhodí chybu, pokud již existuje. Tato kombinace ušetří spoustu zbytečných problémů a dělá kód robustnějším.
Problém nastává také tehdy, když vývojáři zapomínají na relativní versus absolutní cesty. Relativní cesta funguje v závislosti na tom, odkud je skript spuštěn, což může být v různých prostředích naprosto odlišné místo. Skript spuštěný z příkazové řádky může mít jiný pracovní adresář než tentýž skript spuštěný z IDE nebo jako součást většího projektu. Řešením je používat `os.path.abspath(__file__)` nebo `Path(__file__).parent` z modulu `pathlib`, čímž zajistíte, že cesty budou vždy relativní k umístění samotného skriptu, nikoli k aktuálnímu pracovnímu adresáři.
Mazání adresářů je další oblastí plnou potenciálních chyb. Funkce `os.rmdir()` dokáže smazat pouze prázdný adresář, a pokud se pokusíte smazat adresář s obsahem, dostanete chybu `OSError`. Mnoho začátečníků si neuvědomuje, že pro smazání celého adresářového stromu je třeba použít `shutil.rmtree()`. Jenže ani tato funkce není bez rizika — pokud omylem předáte špatnou cestu, může dojít ke smazání důležitých dat bez možnosti obnovy. Proto je vždy dobré před voláním `shutil.rmtree()` důkladně ověřit, co přesně mažete, a případně implementovat nějaký mechanismus potvrzení.
Velmi podceňovanou chybou je také ignorování práv a oprávnění k adresářům. Na systémech Linux a macOS mohou být adresáře chráněny oprávněními, která zabrání čtení, zápisu nebo spuštění. Python v takovém případě vyhodí výjimku `PermissionError`, na kterou spousta kódu vůbec není připravena. Správná praxe zahrnuje ošetření těchto výjimek pomocí bloků `try-except` a poskytnutí srozumitelné chybové zprávy uživateli.
Dalším problémem, se kterým se vývojáři potýkají, je nesprávné procházení adresářů pomocí `os.walk()`. Tato funkce vrací trojici `(dirpath, dirnames, filenames)`, ale začátečníci ji často používají nesprávně nebo zapomínají, že `dirnames` a `filenames` jsou seznamy, nikoli plné cesty. Výsledkem je pak kód, který sice projde bez chyby, ale nepracuje se správnými soubory. Vždy je nutné kombinovat `dirpath` s jednotlivými názvy souborů pomocí `os.path.join()`, aby vznikla platná cesta.
Nesmíme zapomenout ani na problémy s kódováním názvů adresářů. Pokud název adresáře obsahuje diakritiku nebo speciální znaky, může v závislosti na nastavení systému a verzi Pythonu docházet k chybám při čtení nebo zápisu. Python 3 s tímto obecně zachází lépe než Python 2, ale stále je důležité mít na paměti, že různé systémy souborů mohou mít různá omezení ohledně povolených znaků v názvech adresářů a souborů.
Publikováno: 12. 08. 2026
Kategorie: Programování a vývoj