Skip to content

Commit 7b866d1

Browse files
encukoufrenzymadness
authored andcommitted
Add materials on paths & directories
1 parent bfb7754 commit 7b866d1

File tree

5 files changed

+828
-0
lines changed

5 files changed

+828
-0
lines changed
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
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).
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
title: Souborové systémy
2+
style: md
3+
attribution: Petr Viktorin, 2018-2019
4+
license: cc-by-sa-40

0 commit comments

Comments
 (0)