Jak efektivně pracovat se složkami a adresáři v Pythonu

Python

Co je adresář a složka v Pythonu

# Adresáře a složky v Pythonu – jak skutečně fungují?

Když poprvé začnete programovat v Pythonu, možná vás překvapí, jak moc záleží na tom, kde máte svoje soubory uložené. Adresáře a složky tvoří páteř toho, jak je váš počítač organizovaný – bez nich by byl souborový systém jeden velký nepořádek, kde byste se nikdy nic nenašli.

Představte si to jako knihovnu. Nemůžete přece všechny knihy jen tak naházet na hromadu, že? Potřebujete police, sekce, případně menší přihrádky. Přesně tak fungují adresáře – jsou to v podstatě kontejnery, do kterých ukládáte svoje soubory a další podadresáře. Mimochodem, v češtině se termíny adresář a složka používají zaměnitelně, taktakže si klidně vyberte ten, který vám víc sedí.

## Proč je vlastně potřeba tomu rozumět?

Zkuste si vzpomnět na svůj poslední větší projekt. Měli jste tam určitě spoustu souborů – nějaké obrázky, textové dokumenty, možná databáze. Bez pořádné organizace se v tom prostě nevyznáte. Python vám nabízí nástroje, jak s těmito adresáři efektivně pracovat, ať už potřebujete vytvořit novou složku, smazat starou nebo jen projít všechny soubory uvnitř.

Nejčastěji na to použijete modul `os` – ten je taková spolehlivá klasika. Funguje všude stejně, ať už máte Windows, Linux nebo Mac. Pak je tu ještě modernější `pathlib`, který je víc objektově orientovaný a některým lidem připadá intuitivnější. Není lepší nebo horší volba – záleží, co vám víc vyhovuje.

## Jak to funguje na různých systémech?

Tady je jedna věc, která začátečníky často mate. Windows používá zpětná lomítka v cestách (třeba `C:\Users\Dokumenty`), zatímco Linux a Mac používají dopředná lomítka (`/home/dokumenty`). Naštěstí Python je dostatečně chytrý a většinou to vyřeší za vás automaticky. Nemusíte si lámat hlavu nad tím, jestli váš kód poběží na jiném systému.

Každý adresář má dvě základní podoby cesty. Absolutní cesta vám řekne přesnou lokaci od začátku disku – jako když někomu vysvětlujete adresu včetně města a PSČ. Relativní cesta je pak jako říct je to ve vedlejší ulici – záleží na tom, kde právě jste. V Pythonu je důležité vědět, kde se váš program právě nachází – tomu říkáme aktuální pracovní adresář.

## Praktické využití v reálném světě

Představte si, že píšete program pro zpracování fotek. Máte hlavní složku s programem, pak podsložku `vstupy` s původními fotkami, složku `vystupy` pro upravené obrázky a možná ještě `logy` pro záznamy o tom, co program dělal. Tahle stromová struktura vám dovolí mít všechno přehledně pohromadě.

Python vám umožňuje kontrolovat, jestli složka existuje, vypsat všechny soubory uvnitř nebo projít celou hierarchii od shora dolů. To se hodí třeba když hledáte všechny soubory určitého typu nebo chcete udělat zálohu celého projektu.

Není to rocket science, ale pořádné pochopení adresářů vám ušetří spoustu frustrace. Věřte, že když si to jednou správně nastavíte, budete mít život s Pythonem o dost jednodušší.

Modul os pro práci se složkami

# Práce se složkami v Pythonu pomocí modulu os

Když poprvé otevřete Python a potřebujete pracovat se složkami na svém počítači, narazíte na modul os. Tento modul je vaším mostem mezi Pythonem a operačním systémem – ať už používáte Windows, Linux nebo macOS, váš kód prostě funguje.

## Kde vlastně jsem?

Představte si, že píšete skript a potřebujete vědět, ve které složce se právě nacházíte. Funkce os.getcwd() vám to řekne na rovinu – vrátí aktuální pracovní adresář. Třeba zjistíte, že váš skript běží v nějaké podivné složce, kam jste ho určitě nechtěli dát. V takovém případě použijete os.chdir() a přesunete se jinam. Je to jako změnit adresář v příkazové řádce, jen to děláte přímo z Pythonu.

## Vytváření složek

Chcete vytvořit novou složku? Použijete os.mkdir(). Tady ale pozor – tahle funkce je trochu vybíravá. Pokud chcete vytvořit složku dokumenty/projekty/python, ale složka dokumenty/projekty ještě neexistuje, skript vám spadne s chybou. Musíte mít všechny nadřazené složky už vytvořené.

Naštěstí existuje chytřejší varianta: os.makedirs(). Ta vytvoří celou cestu najednou, včetně všech meziúrovní. Pracujete na větším projektu s komplikovanou strukturou? Tahle funkce vám ušetří spoustu času a nervů.

## Mazání – opatrně!

Mazání složek pomocí os.rmdir() má jedno důležité pravidlo: složka musí být prázdná. Zkusíte smazat složku s nějakými soubory uvnitř? Python vám to nedovolí. Musíte nejdřív uklidit uvnitř, nebo použít os.removedirs() pro prázdné vnořené adresáře.

A co když potřebujete smazat složku včetně celého obsahu? Tady vám modul os už moc nepomůže – budete potřebovat modul shutil a jeho funkci rmtree(). Ta si s tím poradí bez problémů.

## Co je ve složce?

Funkce os.listdir() vám vypíše všechno, co je v dané složce – soubory i podsložky. Vrátí vám ale jen názvy, ne celé cesty. To je dobré vědět, protože když pak budete chtít s těmi soubory pracovat, musíte si cesty poskládat sami.

Někdy potřebujete zjistit, jestli určitá cesta vůbec existuje, nebo jestli je to složka nebo soubor. K tomu slouží os.path.exists() a os.path.isdir(). Tyto kontroly jsou základ profesionálního kódu – předejdete tím spoustě chyb a pádů programu.

## Procházení celé struktury

Máte složku s desítkami podsložek a potřebujete projít všechny soubory? Psát na to vlastní rekurzivní funkci by byla otrava. Naštěstí existuje os.walk(), která to udělá za vás. Pro každou složku vám vrátí její cestu, seznam podsložek a seznam souborů. Prostě projdete všechno od shora dolů.

## Cesty napříč systémy

Tady je past, do které spadne skoro každý začátečník: na Windows používáte zpětná lomítka v cestách, na Linuxu a macOS obyčejná lomítka. Když budete cesty skládat ručně jako řetězce, váš kód bude fungovat jen na jednom systému.

Řešení? Funkce os.path.join(). Ta správně spojí části cesty podle toho, na jakém systému zrovna běžíte. Nikdy víc nebudete muset řešit, jestli má být \\ nebo /.

Vytvoření nového adresáře pomocí os.mkdir

Když programujete v Pythonu, občas potřebujete vytvořit novou složku – třeba pro ukládání výstupů z analýzy dat nebo pro organizaci souborů podle kategorií. Přesně k tomu slouží modul os a jeho funkce os.mkdir, která vám umožní vytvářet adresáře přímo za běhu programu.

Jak to vlastně funguje? Celkem jednoduše. Zavoláte funkci a předáte jí cestu, kde chcete novou složku vytvořit. Jenže pozor – os.mkdir vytváří pouze jeden adresář najednou a všechny nadřazené složky v cestě už musí existovat. Zkusíte-li vytvořit složku v neexistující cestě, Python vám vyhodí chybu FileNotFoundError.

Nejdřív musíte na začátku skriptu napsat import os. Potom už stačí zavolat funkci s názvem složky, kterou chcete vytvořit. Představte si, že děláte program na třídění fotografií – můžete automaticky vytvářet složky podle roku nebo měsíce pořízení snímků. Cestu zadáváte buď relativní nebo absolutní, podle toho, co vám víc vyhovuje.

Na unixových systémech máte navíc možnost nastavit přístupová práva přes druhý parametr mode. Standardně se používá hodnota 0o777, která dává plná práva všem, ale skutečná oprávnění závisí ještě na nastavení systému.

V reálném použití se vyplatí myslet dopředu. Co když ta složka už existuje? Python vyhodí FileExistsError a program spadne. Proto zkušení programátoři používají ošetření chyb pomocí bloků try-except nebo si předem zkontrolují, jestli složka neexistuje pomocí os.path.exists.

Důležité je nezaměňovat os.mkdir s funkcí os.makedirs. Zatímco os.mkdir vytváří pouze jeden adresář, os.makedirs zvládne vytvořit celou hierarchii najednou, včetně všech nadřazených složek. Pokud potřebujete vytvořit vnořenou strukturu typu projekt/data/2024/leden, s os.mkdir byste museli vytvářet každou úroveň zvlášť.

Kde se to hodí v praxi? Třeba když píšete program, který každý den ukládá logy do nové složky pojmenované podle data. Nebo když zpracováváte velké množství dat a potřebujete je rozdělit do kategorií. Možná vytváříte dočasný pracovní prostor pro zpracování souborů, který po dokončení smažete. S modulem os a dalšími nástroji Pythonu si můžete postavit systém, který vám automaticky udržuje pořádek v souborech a šetří čas při rutinních úkolech.

Rekurzivní vytváření složek s os.makedirs

Funkce os.makedirs je skvělý pomocník v Pythonu, který vám ušetří spoustu práce při vytváření složitějších adresářových struktur. Představte si, že potřebujete vytvořit několik zanořených složek najednou – os.makedirs to zvládne jedním příkazem. Obyčejná funkce os.mkdir by vás v takové situaci nechala na holičkách, protože dokáže vytvořit jen jednu složku a když nadřazený adresář neexistuje, prostě to vzdá.

Operace s adresářem Python příkaz Popis
Vytvoření adresáře os.mkdir('složka') Vytvoří nový adresář s daným názvem
Vytvoření vnořených adresářů os.makedirs('cesta/k/složce') Vytvoří celou cestu včetně nadřazených adresářů
Smazání prázdného adresáře os.rmdir('složka') Odstraní prázdný adresář
Smazání adresáře se soubory shutil.rmtree('složka') Rekurzivně smaže adresář i s obsahem
Výpis obsahu adresáře os.listdir('cesta') Vrátí seznam všech souborů a podadresářů
Změna aktuálního adresáře os.chdir('cesta') Přesune se do zadaného adresáře
Zjištění aktuálního adresáře os.getcwd() Vrátí cestu k aktuálnímu pracovnímu adresáři
Kontrola existence adresáře os.path.isdir('cesta') Vrátí True, pokud adresář existuje

Jak to vlastně funguje? Když zadáte cestu třeba projekt/data/surova_data/2024, os.makedirs si postupně projde celou strukturu a vytvoří všechny potřebné složky odshora dolů. Nejdřív projekt, pak data uvnitř něj, následně surova_data a nakonec 2024. Jednoduché, že?

Použití je opravdu snadné – stačí naimportovat modul os a zavolat funkci s cestou, kterou potřebujete. Python pak udělá všechnu práci za vás. Tohle se hodí hlavně při automatizaci, kdy váš program musí mít jistotu, že všechny potřebné složky existují, než začne ukládat soubory.

Teď k něčemu důležitému – parametr exist_ok. Znáte to: spustíte skript podruhé a najednou vám vyskočí chyba, že adresář už existuje. Nepříjemné. Naštěstí když nastavíte exist_ok na True, Python se nad existujícími složkami nepozastaví a prostě pokračuje dál. Ideální řešení, když spouštíte stejný skript opakovaně nebo si nejste jistí, jestli složky už někdo nevytvořil.

Můžete také nastavit oprávnění pomocí parametru mode. Většinou výchozí nastavení vyhovuje, ale občas potřebujete přesnější kontrolu kvůli bezpečnosti – třeba když pracujete na serveru nebo s citlivými daty.

Rekurzivní fungování os.makedirs znamená, že zvládne i opravdu hluboké struktury složek. Kolik úrovní potřebujete? Pět? Deset? Žádný problém. Funkce vytvoří všechny mezilehlé adresáře sama, zatímco s os.mkdir byste museli psát příkaz pro každou úroveň zvlášť.

A ještě jedna výhoda: os.makedirs perfektně chápe oddělovače cest na různých systémech. Ať píšete kód na Windows, Linuxu nebo macOS, Python si s tím poradí. Lomítka dopředu, dozadu – to je mu jedno, automaticky použije správný formát. Takže váš kód bude fungovat všude bez úprav.

Kontrola existence adresáře pomocí os.path.exists

# Ověřování existence souborů a adresářů v Pythonu

Když pracujete s adresáři a soubory v Pythonu, pravděpodobně narazíte na situaci, kdy potřebujete zjistit, jestli něco vůbec existuje, než s tím začnete pracovat. Funkce os.path.exists je přesně tím nástrojem, který vám v takových chvílích výrazně usnadní život. Umožňuje vám totiž rychle ověřit, jestli adresář nebo soubor skutečně existuje ve vašem systému.

Celé to začíná importem modulu os, který je standardní součástí Pythonu. Tohle je skvělá zpráva – nemusíte nic instalovat navíc. Modul os vám poskytuje jednotný způsob práce napříč různými operačními systémy, takže váš kód poběží stejně dobře na Windows jako na Linuxu nebo macOS. Samotná funkce exists je pak velmi přímočará – předáte jí cestu jako text a ona vám vrátí True, pokud cesta existuje, nebo False, když ne.

Kde se to hodí v reálném životě? Představte si, že píšete aplikaci, která ukládá logy do konkrétní složky. Co se stane, když ta složka neexistuje? Program prostě spadne s chybou. A to opravdu nechcete. Právě proto je kontrola existence adresáře před zápisem do něj naprosto zásadní. Když zjistíte, že složka chybí, můžete ji jednoduše vytvořit pomocí os.makedirs a pokračovat dál bez komplikací.

Jedna věc, kterou byste měli vědět – os.path.exists nedělá rozdíl mezi soubory a adresáři. Vrátí vám True pro obojí. Potřebujete zjistit konkrétně, jestli jde o složku? Použijte os.path.isdir. Pro kontrolu souborů zase existuje os.path.isfile. Tyto funkce vám dají přesnější informaci o tom, s čím vlastně pracujete.

Dobrá rada na cestu: kombinujte os.path.exists s dalšími pomocníky z modulu os.path. Třeba funkce os.path.join je skvělá na skládání cest způsobem, který funguje všude. Nemusíte se trápit s tím, jestli používat lomítko nebo zpětné lomítko – Python to vyřeší za vás podle toho, na jakém systému běžíte.

Ještě jedna věc, kterou byste neměli přehlédnout. V situacích, kdy s adresářem pracuje víc programů nebo vláken najednou, může nastat problém. Zkontrolujete, že složka existuje, ale než s ní něco uděláte, jiný proces ji smaže. Tomuhle se říká race condition a je to docela zákeřné. V takových případech může být lepší použít přímý pokus o operaci a ošetření případné chyby přes try-except blok.

A co třeba když ve vaší aplikaci zadává cestu uživatel? Určitě byste měli zkontrolovat, jestli to, co zadal, dává smysl a opravdu existuje. Ušetříte si tím spoustu problémů a uživatelé ocení, že aplikace neskončí s nepochopitelnou chybou. Zkrátka – kombinace kontroly existence s dalšími ověřeními vytvoří solidní základ pro spolehlivou práci se soubory.

Získání seznamu souborů funkcí os.listdir

Funkce os.listdir je skvělý pomocník, když potřebujete pracovat se soubory a složkami v Pythonu. Díky ní můžete snadno zjistit, co všechno se nachází v určité složce – dostanete prostě seznam všeho, co tam je, ať už jsou to soubory nebo podsložky. Jen nezapomeňte na začátku naimportovat modul os, který vám otevře dveře k práci s operačním systémem.

Jak to celé funguje? Stačí funkci předat cestu ke složce, kterou chcete prozkoumat. Pokud žádnou cestu nezadáte, Python automaticky ukáže obsah složky, ve které zrovna pracujete. Výsledek je jednoduchý seznam textových položek – každá položka odpovídá jednomu souboru nebo složce. Pozor ale – dostanete jen samotné názvy, ne celé cesty k nim.

V praxi často narazíte na situaci, kdy potřebujete rozlišit, co je soubor a co složka. Samotná funkce os.listdir vám to neřekne – prostě vypíše všechno dohromady. Proto ji obvykle kombinujete s dalšími funkcemi jako os.path.isfile nebo os.path.isdir. Tahle kombinace vám dává mnohem větší kontrolu nad tím, jak se soubory a složkami pracujete.

Co je na téhle funkci opravdu praktické? Funguje stejně na Windows, Linuxu i macOS. Python si sám poradí s tím, že každý systém má trochu jiný způsob, jak zapisuje cesty k souborům. Vy si můžete být jistí, že váš kód poběží všude stejně dobře.

Pár věcí si ale zaslouží pozornost. Ve výsledném seznamu nenajdete tečku a dvě tečky, které normálně v adresářích vidíte – ty reprezentují aktuální a nadřazenou složku. Python je automaticky vynechává, což vám vlastně ušetří práci s jejich pozdějším odstraňováním. Další důležitá věc: pořadí položek v seznamu není zaručené. Při každém spuštění může být trochu jiné.

Hodně lidí používá os.listdir jako základ pro procházení celé struktury složek. Představte si třeba situaci, kdy potřebujete najít všechny fotky ve vašem počítači nebo hromadně přejmenovat stovky souborů. S pomocí rekurze můžete projít všechny složky a podsložky a udělat s nalezanými soubory, co potřebujete.

Nezapomínejte ale na ošetření chyb. Co když zadaná složka neexistuje? Nebo k ní nemáte přístupová práva? V těchto případech Python vyhodí chybu. Profesionální přístup znamená použít try-except konstrukci, která podobné situace zachytí a zajistí, že váš program nespadne při první komplikaci.

Procházení adresářové struktury s os.walk

Když potřebujete projít všechny složky a soubory v nějakém adresáři, funkce os.walk v Pythonu vám ušetří spoustu práce. Místo toho, abyste si sami psali komplikovaný kód, který by musel skákat z jedné složky do druhé, prostě použijete os.walk a máte vystarano.

Jak to vlastně funguje? Představte si to jako procházku stromem – můžete začít nahoře u kmene a postupovat dolů k větvím, nebo naopak. Pro každou složku, kterou projdete, dostanete tři věci: kde se právě nacházíte, jaké podsložky tam jsou a jaké soubory v ní leží.

Jedna skvělá věc na os.walk je, že pracuje jako generátor. To znamená, že nespotřebuje hromady paměti – prostě vrací informace kousek po kousku, jak je potřebujete. Dostanete dirpath (tedy cestu, kde zrovna jste), dirnames (seznam podsložek) a filenames (seznam souborů).

Co s tím můžete dělat? Třeba najít všechny fotky v počítači podle přípony, spočítat, kolik místa zabírají vaše dokumenty, nebo zkopírovat všechny důležité soubory na zálohu. Nejlepší na tom je, že os.walk automaticky projde i všechny vnořené složky – nemusíte řešit, jak se dostat třeba do složky, která je uvnitř jiné složky, která je zase uvnitř další složky.

Chcete ovlivnit, jak se procházení bude dít? Použijte parametr topdown. Když ho nastavíte na True (což je standardní varianta), začnete nahoře a půjdete dolů. Když dáte False, začnete dole a půjdete nahoru. Tohle se hodí třeba když mažete složky – musíte přece nejdřív vymazat obsah, než smažete samotnou složku.

Zajímavé je, že během procházení můžete měnit seznam dirnames. Když z něj něco odstraníte, os.walk tu složku prostě přeskočí. Chcete přeskočit všechny skryté složky nebo třeba složku s názvem temp? Žádný problém.

Ještě je tu parametr followlinks. Standardně je nastavený na False, což znamená, že os.walk nebude následovat symbolické odkazy na adresáře. Proč? Protože by se mohlo stát, že by se dostal do nekonečné smyčky, kdyby odkazy odkazovaly sami na sebe. Když ho zapnete na True, dejte si pozor, aby se vám to nestalo.

Až budete zpracovávat výsledky, použijte os.path.join pro spojení cesty se jménem souboru. Tahle funkce je chytrá – automaticky použije správné lomítko nebo zpětné lomítko podle toho, jestli běžíte na Windows, Linuxu nebo Macu. Váš kód pak poběží všude stejně dobře.

Změna aktuálního pracovního adresáře os.chdir

Když v Pythonu pracujete se soubory a složkami, pravděpodobně vás dříve nebo později napadne: Jak můžu změnit místo, odkud můj program pracuje? Odpověď je jednoduchá – použijete modul os a jeho funkci os.chdir(). Tahle funkce je vlastně jako teleport pro váš program – přesune ho do jiného adresáře a odtud pak pokračuje v práci.

Představte si třeba, že vyvíjíte aplikaci pro zpracování fotografií. Máte je rozházené v různých složkách podle roku a měsíce. Místo toho, abyste psali celé dlouhé cesty k jednotlivým souborům, prostě změníte pracovní adresář na konkrétní složku a pak pracujete s fotkami mnohem pohodlněji.

Jak to funguje? Funkci os.chdir() předáte cestu k adresáři jako text. Můžete použít absolutní cestu – tedy kompletní adresu od kořene disku (například C:/projekty/data), nebo relativní cestu – tu, která vychází z místa, kde zrovna jste (třeba jen ../data). Pozor ale – jakmile adresář změníte, ovlivní to celý běžící program. Všechny operace se soubory pak budou vycházet z tohoto nového místa.

Než někam skočíte, možná byste chtěli vědět, kde vlastně teď jste, ne? K tomu slouží os.getcwd() – tahle funkce vám vrátí aktuální pracovní adresář. Je to jako se zeptat: Kde to jsem? Obě funkce dohromady vám dávají plnou kontrolu nad tím, odkud váš program čte a zapisuje data.

Dejme tomu, že máte projekt strukturovaný do podsložek – jedna pro vstupní data, další pro konfiguraci, třetí pro výsledky. Pomocí os.chdir() můžete elegantně přeskakovat mezi těmito složkami podle toho, co zrovna potřebujete udělat.

Ale pozor na úskalí! Co když zadáte cestu k adresáři, který neexistuje? Nebo k němu nemáte práva přístupu? Python vám to dá pěkně najevo výjimkou FileNotFoundError nebo PermissionError. Proto je rozumné zabalit volání os.chdir() do bloku try-except. Ještě lepší je předem zkontrolovat, jestli adresář vůbec existuje – k tomu můžete použít os.path.exists nebo os.path.isdir.

V praxi se změna pracovního adresáře hodí pořád. Třeba zpracováváte stovky souborů rozmístěných v desítkách složek. Skočíte do konkrétní složky a pak prostě pracujete se soubory jen podle jejich jmen, bez neustálého psaní dlouhých cest. Kód je pak čitelnější a jednodušší na údržbu.

Ještě jedna důležitá věc: změna adresáře pomocí os.chdir() zůstává v platnosti po celou dobu běhu programu, dokud ji sami nezměníte. Někdy je proto chytré si na začátku uložit původní adresář a na konci se do něj vrátit. Váš program pak po sobě nenadělá nepořádek a nezůstane ztracený někde v souborovém systému.

Smazání prázdné složky pomocí os.rmdir

Když pracujete s adresáři v Pythonu, občas potřebujete uklidit a smazat nějakou tu prázdnou složku. Možná vyvíjíte aplikaci, která si vytváří dočasné adresáře, nebo prostě jen čistíte po skriptu, který zanechal nepořádek. V takových chvílích oceníte funkci os.rmdir, která je přesně pro tento účel jako stvořená.

Tahle funkce je vlastně most mezi vaším Python kódem a operačním systémem – jednoduše řečeno, dává pokyn systému, aby tu složku odstranil. Použití je víceméně přímočaré: importujete modul os a zavoláte funkci s cestou k adresáři, který chcete smazat. Jenže pozor – funguje to jen na prázdné složky. Zkusíte smazat adresář, ve kterém ještě něco je? Python vám okamžitě vyhodí OSError. A to není chyba, ale záměr – jde o pojistku proti tomu, abyste si omylem nesmazali důležitá data.

Představte si třeba situaci, kdy váš skript stahuje soubory do dočasné složky, zpracuje je a pak chce po sobě uklidit. Musíte nejdřív smazat všechny soubory uvnitř a teprve pak můžete odstranit samotný adresář. Zapomenete na tento krok a skript spadne. Frustrující, že?

Cesta k adresáři může být absolutní – tedy kompletní adresa od kořene systému – nebo relativní, vztažená k místu, odkud váš program právě běží. Relativní cesty jsou často praktičtější při práci s projekty, protože struktura složek je obvykle předem daná a nemusíte řešit, kde přesně na disku se zrovna nacházíte.

Co je ale opravdu důležité? Ošetřit chyby. Bez toho se neobejdete. Adresář nemusí existovat, možná na něj nemáte oprávnění, nebo v něm zůstaly nějaké soubory. Použijte konstrukci try-except a vaš program se nesesype při prvním problému. Místo toho můžete uživateli sdělit, co se stalo, nebo zkusit jiné řešení.

Víte, v čem je os.rmdir jiná než třeba shutil.rmtree? Právě v té přísnosti. Zatímco os.rmdir vyžaduje prázdný adresář, shutil.rmtree smaže úplně všechno – celý strom včetně souborů a podsložek. Záleží na tom, co potřebujete. Chcete mít kontrolu nad každým krokem? Volte os.rmdir. Potřebujete rychle uklidit velkou strukturu? Pak je tady shutil.rmtree.

Nesmíte zapomenout na oprávnění. V některých případech může být nutné spustit skript s elevated oprávněními, jinak operace prostě neprojde. Tohle je zvlášť důležité na produkčních serverech, kde bezpečnost hraje hlavní roli.

Chcete psát skutečně spolehlivý kód? Nejdřív zkontrolujte, jestli ten adresář vůbec existuje (os.path.exists) a jestli je prázdný (os.listdir). Je to o pár řádků víc, ale ušetříte si spoustu problémů. Váš kód bude předvídatelný a nebude vás překvapovat nečekanými pády.

Modul pathlib jako moderní alternativa

Modul pathlib přináší do Pythonu moderní způsob práce se soubory a složkami, který je mnohem příjemnější než staré metody. Když s ním začnete pracovat, pravděpodobně si vzpomenete na ty chvíle, kdy jste se trápili se skládáním cest pomocí řetězců a neustále řešili problémy s lomítky a zpětnými lomítky mezi Windows a Linuxem.

Představte si, že místo nekonečného spojování textových řetězců máte k dispozici chytré objekty, které za vás vyřeší většinu práce. Přesně to pathlib dělá. Pracuje s cestami jako s objekty, které mají své vlastní metody a vlastnosti – což znamená, že váš kód je čitelnější a dělá přesně to, co od něj čekáte.

Když potřebujete vytvořit novou složku, není nic jednoduššího než použít metodu mkdir(). A to nejlepší? Můžete jí říct, ať vytvoří i všechny nadřazené složky najednou. Žádné komplikované kontroly, jestli složka existuje, žádné ruční vytváření každé úrovně zvlášť.

Procházení složek je s pathlib opravdu elegantní záležitost. Potřebujete najít všechny obrázky v projektu? Použijete glob() s hvězdičkou a máte hotovo. Chcete prohledat i všechny podsložky? Stačí přidat rglob() a modul za vás projde celou strukturu. Pamatujete si, jak komplikované to bývalo dřív?

Co se mi na pathlib opravdu líbí, je jak snadno získáte informace o souborech. Chcete název souboru? Máte vlastnost name. Potřebujete příponu? Použijete suffix. Nadřazenou složku? To je parent. Všechno je logické a intuitivní, žádné složité řetězcové operace nebo krkolomné výrazy.

Ověření, jestli soubor nebo složka existuje, je otázka jedné metody – exists(), is_file() nebo is_dir(). Vrátí vám prostě ano nebo ne, bez zbytečných komplikací.

Spojování cest pomocí lomítka je pak taková třešnička na dortu. Místovolání funkcí píšete kód, který vypadá přesně jako cesta v souborovém systému. Je to přirozené, čitelné a funguje to na všech operačních systémech stejně. Prostě napíšete složka / podsložka / soubor a máte hotovo.

A když potřebujete rychle přečíst nebo zapsat textový soubor? Metody read_text() a write_text() vám ušetří spoustu psaní. Nemusíte ručně otevírat a zavírat soubory, pathlib to za vás obstará.

Kopírování a přesouvání adresářů modulem shutil

Když pracujete s Python projekty, určitě jste už zažili situaci, kdy potřebujete zkopírovat celou složku se všemi podadresáři nebo přesunout projektovou strukturu na jiné místo. Právě pro tyto situace existuje modul shutil, který vám ušetří spoustu práce a hlavně bolesti hlavy.

Na rozdíl od základního modulu os, který pracuje spíš na nižší úrovni, shutil vám nabízí nástroje pro práci s celými adresářovými strukturami najednou. Představte si, že máte projekt s desítkami složek a stovkami souborů – určitě je nechcete kopírovat jeden po druhém, že?

## Kopírování celých složek

Funkce shutil.copytree() je vaším nejlepším přítelem, když potřebujete zkopírovat celý adresář včetně všeho, co obsahuje. Funguje rekurzivně, což znamená, že projde všechny podadresáře a soubory a vytvoří jejich přesnou kopii na novém místě.

Stačí jí předat dvě věci: odkud kopírovat a kam. Je tu ale jeden háček – cílová složka nesmí existovat. Pokud už tam nějaká je, Python vyhodí chybu. Tohle může být zpočátku trochu matoucí, ale dává to smysl – chráníte se tak před náhodným přepsáním důležitých dat.

Skvělé na copytree je, že zachovává všechna metadata souborů. Časová razítka, oprávnění – všechno zůstane tak, jak má. To oceníte hlavně při zálohování nebo když vytváříte kopii projektu pro testování.

## Co když nechcete zkopírovat úplně všechno?

Tady to začíná být zajímavé. Často se stává, že v projektu máte soubory, které kopírovat nechcete – třeba dočasné soubory, cache nebo kompilované Python soubory s příponou .pyc.

Proto má copytree parametr ignore, kterému můžete říct, co má přeskočit. Nemusíte psát složité funkce – shutil obsahuje pomocníka ignore_patterns, který funguje podobně jako vzory v shellu. Chcete vynechat všechny .pyc soubory a složky __pycache__? Žádný problém.

## Přesouvání složek

Funkce shutil.move() je o něco chytřejší než obyčejné kopírování. V podstatě zkopíruje data na nové místo a pak smaže originál. Ale pozor – pokud je to možné, využije jednoduché přejmenování na úrovni systému, což je mnohem rychlejší.

Move je také flexibilnější. Funguje jak se soubory, tak se složkami. A když je cíl existující adresář, zdrojová složka se tam prostě přesune jako podadresář. Docela intuitivní, ne?

## Na co si dát pozor

Kopírování velkých složek není legrace. Může to trvat věčnost a sežrat spoustu místa na disku. Už jste někdy kopírovali gigabajty dat a čekali, až se to konečně dokončí?

Proto je důležité ošetřovat výjimky. Co když nemáte oprávnění ke čtení nějakého souboru? Co když dojde místo na disku uprostřed kopírování? Python vám vyhodí výjimku – třeba PermissionError nebo OSError – a vy byste na to měli být připravení.

## Moderní vylepšení

Novější verze Pythonu přinesly fajn novinku: parametr dirs_exist_ok pro copytree. Díky němu můžete kopírovat i do už existující složky, což dřív nešlo. Zní to jako maličkost, ale v praxi vám to ušetří psaní spousty pomocného kódu, který by kontroloval, jestli cesta existuje nebo ne.

Shutil vám prostě dává všechny nástroje, které potřebujete pro práci se složkami, aniž byste museli řešit tisíc drobností. A to je přesně to, co od dobré knihovny čekáte.

Práce s adresáři v Pythonu je jako procházení knihovnou - musíte znát cestu ke správné police, abyste našli knihu, kterou hledáte. Modul os.path a pathlib nám poskytují elegantní způsoby, jak manipulovat se složkami a soubory napříč různými operačními systémy.

Vratislav Horáček

Práce s absolutními a relativními cestami

# Cesty k souborům v Pythonu: absolutní vs. relativní

Když pracujete s programováním v Pythonu, určitě jste už narazili na situaci, kdy jste potřebovali otevřít nějaký soubor nebo přistoupit ke složce. A právě tady přichází na řadu pochopení rozdílu mezi absolutními a relativními cestami – věřte mi, že vám to ušetří spoustu frustrace.

Absolutní cesta je v podstatě kompletní adresa vašeho souboru od samého začátku diskové struktury. Představte si to jako GPS souřadnice – vždycky ukazují na to stejné místo, ať už se nacházíte kdekoli. Na Windows to vypadá třeba takto: C:\Users\Uzivatel\Dokumenty\projekt\data.txt, na Linuxu nebo Macu pak /home/uzivatel/dokumenty/projekt/data.txt. Vidíte ten rozdíl? Windows začíná písmenem disku, Unix-based systémy rovnou lomítkem. Hlavní výhoda? Naprostá jednoznačnost – spustíte program odkudkoli a cesta vede pořád na stejné místo.

A co relativní cesta? Ta funguje jako navigace typu jdi odtud doprava a pak rovně – vše se odvíjí od toho, kde se právě nacházíte. Když už jste v adresáři projekt a potřebujete soubor ze složky data, stačí napsat data/soubor.txt. Žádné dlouhé vypisování celé cesty. Tohle je skvělé zejména proto, že můžete celý projekt přesunout kamkoli chcete, zkopírovat na jiný počítač, a všechno prostě funguje.

V Pythonu máte k dispozici modul os.path, který vám s cestami výrazně ulehčí práci. Potřebujete z relativní cesty udělat absolutní? Použijte os.path.abspath(). Chcete to naopak? Máte tu os.path.relpath(). Ale pozor – když spojujete části cesty dohromady, vždycky používejte os.path.join(). Tahle funkce totiž sama pozná, jestli jste na Windows nebo Linuxu, a použije správný oddělovač. Ušetříte si tím hodiny debugování, věřte mi.

Novější Python nabízí ještě elegantnější řešení – modul pathlib. Tohle je opravdu pecka, protože pracuje s cestami jako s objekty. Můžete použít obyčejné lomítko pro skládání cest, což vypadá mnohem přirozeněji. Metoda resolve() vám automaticky převede relativní cestu na absolutní a vyřeší všechny ty záludnosti jako symbolické odkazy. A když si nejste jistí, jestli máte absolutní nebo relativní cestu, stačí zavolat is_absolute().

Jak se tedy rozhodnout, kterou cestu použít? Záleží na kontextu vašeho projektu. Absolutní cesty dávají smysl, když pracujete se systémovými soubory nebo když prostě musíte mít jistotu, že přistupujete k tomu správnému místu. Typicky třeba konfigurace, logy nebo dočasné soubory systému.

Relativní cesty jsou pak vaším nejlepším přítelem při práci na projektech. Celou strukturu můžete vzít a přesunout kamkoli – na server, do cloudu, kolegovi na disk – a všechno bude fungovat bez jediné změny v kódu. Není to nádhera?

Možná se ptáte, jak zjistit, kde se vlastně nacházíte. Python má na to os.getcwd() pro zjištění aktuálního adresáře a os.chdir() pro jeho změnu. Ale tady bych doporučil opatrnost – změna pracovního adresáře může způsobit, že se vám najednou přestanou fungovat všechny relativní cesty v programu. Lepší je cesty poskládat programově, než se pokoušet měnit, odkud program běží.

Ještě jedna věc, na kterou nesmíte zapomenout: Windows a Unix-based systémy mluví trochu jiným jazykem. Windows miluje zpětná lomítka (\), zatímco Linux a Mac preferují ta dopředná (/). Python je naštěstí chytrý a většinou to vyřeší sám, ale když píšete kód, který má běžet všude, musíte na to myslet. Proto ty funkce jako os.path.join() nebo pathlib – ony to za vás vyřeší automaticky.

Zkrátka a dobře – pochopení rozdílu mezi absolutními a relativními cestami vám otevře dveře k psaní kódu, který je nejen funkční, ale taky přenositelný a snadno udržovatelný. A to je přesně to, co od dobrého kódu chceme, ne?

Publikováno: 12. 05. 2026

Kategorie: Programování a vývoj