|
| 1 | +# Soubory a cesty |
| 2 | + |
| 3 | +Informace uložené v Pythonních proměnných – seznamech, slovnících, a tak dále – jsou dočasné. |
| 4 | +Jakmile Python ukončíš, zmizí. |
| 5 | +Chceš-li něco uložit na delší dobu, nebo třeba sdílet s jinými programy, |
| 6 | +můžeš si informace uložit do souboru. |
| 7 | + |
| 8 | +S počítačovými soubory (angl. *files*) už ses asi setkal{{a}}. |
| 9 | +Teď se na ně ale podívejme trochu podrobněji. |
| 10 | + |
| 11 | +Soubor je místo, kam se dají ukládat informace – *obsah*. Kromě obsahu mají soubory ještě další vlastnosti: |
| 12 | + |
| 13 | +* *jméno*, podle kterého se soubor dá najít, |
| 14 | +* informace o *vlastnictví* a *oprávnění*, které určují kdo může ze souboru |
| 15 | + číst a kdo do něj může zapisovat, |
| 16 | +* informace o *časech* vytvoření, posledního zápisu, a podobně, |
| 17 | +* a další informace, na každém druhu operačního systému jiné. |
| 18 | + |
| 19 | +Tak jako je kapitola v knížce poskládaná z písmenek, obsah souboru je |
| 20 | +poskládaný z *bajtů* (angl. *bytes*) – malých čísel. |
| 21 | +Každá informace, kterou počítač umí zpracovat, se dá zakódovat do bajtů |
| 22 | +podobně jako se z písmenek skládá text. |
| 23 | + |
| 24 | +Soubory jsou většinou uloženy na disku (nebo podobném médiu), kde bývá místo |
| 25 | +na bilióny bajtů. |
| 26 | +Aby počítač poznal, kde na disku je který soubor, používá *souborový systém* |
| 27 | +(angl. *filesystem*). |
| 28 | +Ten plní podobnou funkci jako v knížce obsah, jména kapitol a čísla stránek. |
| 29 | + |
| 30 | + |
| 31 | +## Operační systémy |
| 32 | + |
| 33 | +Souborových systémů existuje spousta druhů. |
| 34 | +Experti nám snad prominou hrubé zjednodušení, když si je rozdělíme na dva |
| 35 | +druhy: ty pro Windows a ty pro Unix. |
| 36 | + |
| 37 | +Unix je operační systém, vytvořený v sedmdesátých letech, ze kterého vycházejí |
| 38 | +dnešní systémy Linux, macOS a další. |
| 39 | +Základní principy, o kterých bude řeč tady, se od dob Unixu většinou |
| 40 | +příliš nezměnily. |
| 41 | +A tak když v těchto materiákech uvidíš jméno „Unix“, jde o něco společné pro |
| 42 | +Linux i macOS. |
| 43 | +Hlavní rozdíly mezi Linuxem a macOS jsou v konvencích – např. na Linuxu se |
| 44 | +místo pro domovské adresáře jmenuje většinou `/home`, kdežto na macOS `/Users`. |
| 45 | + |
| 46 | +Další rozšířený operační systém, Windows, z Unixu nevychází. |
| 47 | +Některé věci se v něm, jak později uvidíme, chovají jinak. |
| 48 | + |
| 49 | + |
| 50 | +## Adresáře |
| 51 | + |
| 52 | +Na dnešních souborových systémech jsou soubory tříděny do *adresářů* neboli |
| 53 | +*složek* (angl. *directory*, *folder*). |
| 54 | +Adresář může obsahovat spoustu souborů nebo i jiných adresářů. |
| 55 | + |
| 56 | +A teď něco, co pro tebe může být nové: pro programátory jsou adresáře taky soubory. |
| 57 | +Souborů je dokonce spousta druhů: *normální soubory* s informacemi, adresáře |
| 58 | +(které obsahují další soubory), speciální soubory které můžou reprezentovat |
| 59 | +celý disk nebo spojení mezi počítači, odkazy na jiné soubory, a tak dále. |
| 60 | +Co je a co není soubor závisí na systému. |
| 61 | +Dnes se proto omezíme jen na dva druhy souborů, které najdeme jak na Windows |
| 62 | +tak na Unixu: normální datové soubory (ty, které si pod jménem „soubor“ |
| 63 | +představí běžný uživatel) a adresáře. |
| 64 | + |
| 65 | + |
| 66 | +## Cesty |
| 67 | + |
| 68 | +Abys mohl/a najít nějaký soubor, potřebuješ znát jeho jméno a adresář, |
| 69 | +který ten soubor obsahuje. |
| 70 | +Abys pak mohl/a najít ten adresář, musíš opět znát jméno adresáře a adresář, |
| 71 | +který ho obsahuje. |
| 72 | +A tak dál, až se dostaneš ke *kořenovému adresáři* (angl. *root directory*), |
| 73 | +který (zjednodušeně řečeno) obsahuje celý souborový systém. |
| 74 | +Když napíšeš jména všech adresářů které takhle projdeš za sebe, dostaneš |
| 75 | +*cestu* (angl. *path*) k danému souboru. |
| 76 | +Taková cesta by mohla na Unixu být třeba: |
| 77 | + |
| 78 | +* Linux: `/home/janca/Documents/archiv.tar.gz` |
| 79 | +* macOS: `/Users/janca/Documents/archiv.tar.gz` |
| 80 | + |
| 81 | +To znamená, že začneš v kořenovém adresáři (který se na Linuxu jmenuje `/`), |
| 82 | +v něm hledáš adresář `home` nebo `Users` (ten tradičně obsahuje domovské |
| 83 | +adresáře uživatelů), v něm pak `janca` (podle uživatelského jména), |
| 84 | +v něm `Documents`, a v něm pak `archiv.tar.gz`. |
| 85 | +To už není adresář, ale normální soubor do kterého se dají zapsat informace. |
| 86 | + |
| 87 | +Obdobná cesta na Windows by mohla být třeba: |
| 88 | +`C:\Users\Jana\Documents\archiv.tar.gz` |
| 89 | + |
| 90 | +Tahle cesta začíná na disku `C:`. |
| 91 | +Windows mají na rozdíl od Unixu zvláštní souborový systém pro každý disk, |
| 92 | +a tak mají víc kořenových adresářů – třeba `C:\` a `D:\`. |
| 93 | +Dál je to podobné jako na Unixu, jen oddělovač adresářů je zpětné lomítko |
| 94 | +místo obyčejného. |
| 95 | + |
| 96 | +## Absolutní a relativní cesty |
| 97 | + |
| 98 | +Cesta, která začíná v konkrétním kořenovém adresáři, se nazývá *absolutní* |
| 99 | +cesta (angl. *absolute* path). Je jako úplná poštovní adresa: |
| 100 | +správně nadepsaný dopis můžu hodit do schránky kdekoli na světě a (teoreticky) |
| 101 | +vždy dojde k adresátovi. |
| 102 | + |
| 103 | +Když ale dopis do Česka házím do české schránky, můžu vynechat informaci |
| 104 | +o kontinentu a zemi. |
| 105 | +Je to tak kratší a jednodušší‚ ale z Austrálie by to nefungovalo. |
| 106 | + |
| 107 | +Na podobném principu jsou založeny *relativní cesty* (angl. *relative paths*). |
| 108 | +Když už jsi v domovském adresáři, stačí zadat cestu `Documents/archiv.tar.gz`, |
| 109 | +bez lomítek či jména disku na začátku. |
| 110 | +To znamená, že cesta nezačíná v kořenovém adresáři, ale v *aktuálním adresáři* |
| 111 | +(angl. *current directory*) – tam, kde právě jsi. |
| 112 | +Kdyby ses pomocí `cd` přepnul{{a}} jinam, tahle relativní cesta by přestala |
| 113 | +fungovat. |
| 114 | + |
| 115 | +Kde relativní cesta „začíná“, to záleží na kontextu – většinou jde o aktuální |
| 116 | +adresář, ale může to být třeba gitový repozitář |
| 117 | +(hlavní adresář nějakého projektu), adresář s programem který právě běží, |
| 118 | +a podobně. |
| 119 | + |
| 120 | +## Dvě tečky a jedna tečka |
| 121 | + |
| 122 | +Každý adresář obsahuje dva speciální záznamy: `..` a `.`. |
| 123 | + |
| 124 | +Jméno `.` (tečka) vždy označuje samotný adresář. |
| 125 | +Tudíž `/home/janca` je stejný adresář jako `/home/janca/.`, |
| 126 | +`/home/janca/././././.` a tak dál. |
| 127 | +To nezní moc užitečně – ale jen do té doby, než potřebuješ zadat jako |
| 128 | +relativní cestu samotný aktuální adresář. |
| 129 | + |
| 130 | +Jméno `..` (dvě tečky) označuje *nadřazený adresář*. |
| 131 | +Když se tohle jméno objeví v cestě, znamená to, že potřebujeme přejít |
| 132 | +o úroveň výš. |
| 133 | +Jsi-li v adresáři `/home/janca/Pictures/dovolena`, tak: |
| 134 | + |
| 135 | +* cesta `..` znamená adresář `/home/janca/Pictures` |
| 136 | +* cesta `../../programy/venv` znamená `/home/janca/programy/venv` |
| 137 | +* absolutní cesta `/home/janca/Documents/../Pictures/dovolena` |
| 138 | + znamená `/home/janca/Pictures/dovolena` |
| 139 | + |
| 140 | +> [note] |
| 141 | +> Striktně řečeno, výše uvedené neplatí vždycky: |
| 142 | +> speciální soubory zvané *symbolické odkazy* (angl. *symlinks*) můžou počítač |
| 143 | +> při procházení cesty přesměrovat tak, že `Documents/../Pictures` bude jiný |
| 144 | +> soubor než `Pictures`. |
| 145 | +> Detaily jsou nad rámec těchto materiálů, nicméně je to důvod, proč Python |
| 146 | +> nebude automaticky nahrazovat `Documents/../Pictures` za `Pictures`. |
| 147 | +
|
| 148 | + |
| 149 | +## Jména souborů |
| 150 | + |
| 151 | +Jméno souboru je řetězec. Nemůže to ale být jakýkoli řetězec. |
| 152 | +Různé systémy mají různou maximální délku jména (i když na tenhle limit dnes |
| 153 | +většinou nenarazíš). |
| 154 | +A navíc je omezen i obsah – jméno souboru nesmí obsahovat: |
| 155 | + |
| 156 | +* na Unixu oddělovač adresářů `/` ani speciální nulový znak, |
| 157 | +* na windows oddělovač `\`, znaky `<>:"/|?*` ani speciální znaky (např. |
| 158 | + tabulátor, znak nového řádku). |
| 159 | + |
| 160 | +Nedoporučuji s názvy příliš experimentovat, protože některé validní znaky |
| 161 | +můžou v určitých kontextech mít zvláštní význam (např. `*` a `?` jako zástupné |
| 162 | +znaky), špatně se používají (např. mezery a nové řádky), působí problémy |
| 163 | +s kódováním (např. písmena s diakritikou nebo emoji), nebo naráží na problémy |
| 164 | +s tím, že Windows nerozlišují velikost písmen ale Unix ano. |
| 165 | + |
| 166 | +Programátoři by se tak měli omezit na: |
| 167 | + |
| 168 | +* malá písmena bez diakritiky, |
| 169 | +* číslice `0` - `9`, |
| 170 | +* pomlčku `-`, |
| 171 | +* podtržítko `_`, a |
| 172 | +* tečku jako oddělovač přípony. |
| 173 | + |
| 174 | +Možná sis všiml{{a}}, že normální lomítko, `/`, nesmí na Windows být ve jménu |
| 175 | +souboru. |
| 176 | +Spousta moderních programů (včetně většiny knihoven v Pythonu) toho využívá a |
| 177 | +dopředná lomítka automaticky zaměňuje za zpětná. |
| 178 | +Můžeš tak na všech systémech používat stejné relativní cesty: `Documents/archiv.tar.gz` většinou funguje i na Windows. |
| 179 | + |
| 180 | + |
| 181 | +## Přípony |
| 182 | + |
| 183 | +Hodně jmen souborů obsahuje tečku a za ní krátkou *příponu* (angl. *extension*), |
| 184 | +která tradičně indikuje formát souboru – způsob, |
| 185 | +kterým jsou v souboru zakódovány informace. |
| 186 | +Například soubor `hrad.jpeg` má příponu `.jpeg`. |
| 187 | +Ten kdo ví, že [JPEG](https://cs.wikipedia.org/wiki/JPEG) je způsob zakódování |
| 188 | +obrázku (zvlášť vhodný pro fotografie), si tak může domyslet že v souboru je |
| 189 | +nejspíš fotka hradu. |
| 190 | + |
| 191 | +Pythonisti zase poznají příponu `.py`. |
| 192 | +Python samotný ji vyžaduje: příkaz `import module` hledá soubor `module.py`. |
| 193 | + |
| 194 | +Přípony jsou zvlášť důležité na Windows, kde se podle nich vybírá program, |
| 195 | +kterým se soubor otevře. |
| 196 | +(Unix se oproti tomu dívá v prvé řadě na samotný obsah souboru.) |
| 197 | + |
| 198 | +Přípon se může objevit i víc: `archiv.tar.gz` nejspíš obsahuje několik souborů spojených dohromady ve formátu [tar](https://cs.wikipedia.org/wiki/Tar_%28informatika%29) a pak zkomprimovaných ve formátu [gzip](https://cs.wikipedia.org/wiki/Gzip). |
0 commit comments