-
Notifications
You must be signed in to change notification settings - Fork 118
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add materials on paths & directories #650
Draft
encukou
wants to merge
3
commits into
pyvec:master
Choose a base branch
from
encukou:pathlib
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
# Soubory a cesty | ||
|
||
Informace uložené v Pythonních proměnných – seznamech, slovnících, a tak dále – jsou dočasné. | ||
Jakmile Python ukončíš, zmizí. | ||
Chceš-li něco uložit na delší dobu, nebo třeba sdílet s jinými programy, | ||
můžeš si informace uložit do souboru. | ||
|
||
S počítačovými soubory (angl. *files*) už ses asi setkal{{a}}. | ||
Teď se na ně ale podívejme trochu podrobněji. | ||
|
||
Soubor je místo, kam se dají ukládat informace – *obsah*. Kromě obsahu mají soubory ještě další vlastnosti: | ||
|
||
* *jméno*, podle kterého se soubor dá najít, | ||
* informace o *vlastnictví* a *oprávnění*, které určují kdo může ze souboru | ||
číst a kdo do něj může zapisovat, | ||
* informace o *časech* vytvoření, posledního zápisu, a podobně, | ||
* a další informace, na každém druhu operačního systému jiné. | ||
|
||
Tak jako je kapitola v knížce poskládaná z písmenek, obsah souboru je | ||
poskládaný z *bajtů* (angl. *bytes*) – malých čísel. | ||
Každá informace, kterou počítač umí zpracovat, se dá zakódovat do bajtů | ||
podobně jako se z písmenek skládá text. | ||
|
||
Soubory jsou většinou uloženy na disku (nebo podobném médiu), kde bývá místo | ||
na bilióny bajtů. | ||
Aby počítač poznal, kde na disku je který soubor, používá *souborový systém* | ||
(angl. *filesystem*). | ||
Ten plní podobnou funkci jako v knížce obsah, jména kapitol a čísla stránek. | ||
|
||
|
||
## Operační systémy | ||
|
||
Souborových systémů existuje spousta druhů. | ||
Experti nám snad prominou hrubé zjednodušení, když si je rozdělíme na dva | ||
druhy: ty pro Windows a ty pro Unix. | ||
|
||
Unix je operační systém, vytvořený v sedmdesátých letech, ze kterého vycházejí | ||
dnešní systémy Linux, macOS a další. | ||
Základní principy, o kterých bude řeč tady, se od dob Unixu většinou | ||
příliš nezměnily. | ||
A tak když v těchto materiálech uvidíš jméno „Unix“, jde o něco společné pro | ||
Linux i macOS. | ||
Hlavní rozdíly mezi Linuxem a macOS jsou v konvencích – např. na Linuxu se | ||
místo pro domovské adresáře jmenuje většinou `/home`, kdežto na macOS `/Users`. | ||
|
||
Další rozšířený operační systém, Windows, z Unixu nevychází. | ||
Některé věci se v něm, jak později uvidíme, chovají jinak. | ||
|
||
|
||
## Adresáře | ||
|
||
Na dnešních souborových systémech jsou soubory tříděny do *adresářů* neboli | ||
*složek* (angl. *directory*, *folder*). | ||
Adresář může obsahovat spoustu souborů nebo i jiných adresářů. | ||
|
||
A teď něco, co pro tebe může být nové: pro programátory jsou adresáře taky soubory. | ||
Souborů je dokonce spousta druhů: *normální soubory* s informacemi, adresáře | ||
(které obsahují další soubory), speciální soubory které můžou reprezentovat | ||
celý disk nebo spojení mezi počítači, odkazy na jiné soubory, a tak dále. | ||
Co je a co není soubor závisí na systému. | ||
Dnes se proto omezíme jen na dva druhy souborů, které najdeme jak na Windows | ||
tak na Unixu: normální datové soubory (ty, které si pod jménem „soubor“ | ||
představí běžný uživatel) a adresáře. | ||
|
||
|
||
## Cesty | ||
|
||
Abys mohl{{a}} najít nějaký soubor, potřebuješ znát jeho jméno a adresář, | ||
který ten soubor obsahuje. | ||
Abys pak mohl/a najít ten adresář, musíš opět znát jméno adresáře a adresář, | ||
který ho obsahuje. | ||
A tak dál, až se dostaneš ke *kořenovému adresáři* (angl. *root directory*), | ||
který (zjednodušeně řečeno) obsahuje celý souborový systém. | ||
Když napíšeš jména všech adresářů které takhle projdeš za sebe, dostaneš | ||
*cestu* (angl. *path*) k danému souboru. | ||
Taková cesta by mohla na Unixu být třeba: | ||
|
||
* Linux: `/home/janca/Documents/archiv.tar.gz` | ||
* macOS: `/Users/janca/Documents/archiv.tar.gz` | ||
|
||
To znamená, že začneš v kořenovém adresáři (který se na Linuxu jmenuje `/`), | ||
v něm hledáš adresář `home` nebo `Users` (ten tradičně obsahuje domovské | ||
adresáře uživatelů), v něm pak `janca` (podle uživatelského jména), | ||
v něm `Documents`, a v něm pak `archiv.tar.gz`. | ||
To už není adresář, ale normální soubor do kterého se dají zapsat informace. | ||
|
||
Obdobná cesta na Windows by mohla být třeba: | ||
`C:\Users\Jana\Documents\archiv.tar.gz` | ||
|
||
Tahle cesta začíná na disku `C:`. | ||
Windows mají na rozdíl od Unixu zvláštní souborový systém pro každý disk, | ||
a tak mají víc kořenových adresářů – třeba `C:\` a `D:\`. | ||
Dál je to podobné jako na Unixu, jen oddělovač adresářů je zpětné lomítko | ||
místo obyčejného. | ||
|
||
## Absolutní a relativní cesty | ||
|
||
Cesta, která začíná v konkrétním kořenovém adresáři, se nazývá *absolutní* | ||
cesta (angl. *absolute* path). Je jako úplná poštovní adresa: | ||
správně nadepsaný dopis můžu hodit do schránky kdekoli na světě a (teoreticky) | ||
vždy dojde k adresátovi. | ||
|
||
Když ale dopis do Česka házím do české schránky, můžu vynechat informaci | ||
o kontinentu a zemi. | ||
Je to tak kratší a jednodušší‚ ale z Austrálie by to nefungovalo. | ||
|
||
Na podobném principu jsou založeny *relativní cesty* (angl. *relative paths*). | ||
Když už jsi v domovském adresáři, stačí zadat cestu `Documents/archiv.tar.gz`, | ||
bez lomítek či jména disku na začátku. | ||
To znamená, že cesta nezačíná v kořenovém adresáři, ale v *aktuálním adresáři* | ||
(angl. *current directory*) – tam, kde právě jsi. | ||
Kdyby ses pomocí `cd` přepnul{{a}} jinam, tahle relativní cesta by přestala | ||
fungovat. | ||
|
||
Kde relativní cesta „začíná“, to záleží na kontextu – většinou jde o aktuální | ||
adresář, ale může to být třeba gitový repozitář | ||
(hlavní adresář nějakého projektu), adresář s programem který právě běží, | ||
a podobně. | ||
|
||
## Dvě tečky a jedna tečka | ||
|
||
Každý adresář obsahuje dva speciální záznamy: `..` a `.`. | ||
|
||
Jméno `.` (tečka) vždy označuje samotný adresář. | ||
Tudíž `/home/janca` je stejný adresář jako `/home/janca/.`, | ||
`/home/janca/././././.` a tak dál. | ||
To nezní moc užitečně – ale jen do té doby, než potřebuješ zadat jako | ||
relativní cestu samotný aktuální adresář. | ||
|
||
Jméno `..` (dvě tečky) označuje *nadřazený adresář*. | ||
Když se tohle jméno objeví v cestě, znamená to, že potřebujeme přejít | ||
o úroveň výš. | ||
Jsi-li v adresáři `/home/janca/Pictures/dovolena`, tak: | ||
|
||
* cesta `..` znamená adresář `/home/janca/Pictures` | ||
* cesta `../../programy/venv` znamená `/home/janca/programy/venv` | ||
* absolutní cesta `/home/janca/Documents/../Pictures/dovolena` | ||
znamená `/home/janca/Pictures/dovolena` | ||
|
||
> [note] | ||
> Striktně řečeno, výše uvedené neplatí vždycky: | ||
> speciální soubory zvané *symbolické odkazy* (angl. *symlinks*) můžou počítač | ||
> při procházení cesty přesměrovat tak, že `Documents/../Pictures` bude jiný | ||
> soubor než `Pictures`. | ||
> Detaily jsou nad rámec těchto materiálů, nicméně je to důvod, proč Python | ||
> nebude automaticky nahrazovat `Documents/../Pictures` za `Pictures`. | ||
|
||
|
||
## Jména souborů | ||
|
||
Jméno souboru je řetězec. Nemůže to ale být jakýkoli řetězec. | ||
Různé systémy mají různou maximální délku jména (i když na tenhle limit dnes | ||
většinou nenarazíš). | ||
A navíc je omezen i obsah – jméno souboru nesmí obsahovat: | ||
|
||
* na Unixu oddělovač adresářů `/` ani speciální nulový znak, | ||
* na Windows oddělovač `\`, znaky `<>:"/|?*` ani speciální znaky (např. | ||
tabulátor, znak nového řádku). | ||
|
||
Nedoporučuji s názvy příliš experimentovat, protože některé validní znaky | ||
můžou v určitých kontextech mít zvláštní význam (např. `*` a `?` jako zástupné | ||
znaky), špatně se používají (např. mezery a nové řádky), působí problémy | ||
s kódováním (např. písmena s diakritikou nebo emoji), nebo naráží na problémy | ||
s tím, že Windows nerozlišují velikost písmen ale Unix ano. | ||
|
||
Programátoři by se tak měli omezit na: | ||
|
||
* malá písmena bez diakritiky, | ||
* číslice `0` - `9`, | ||
* pomlčku `-`, | ||
* podtržítko `_`, a | ||
* tečku jako oddělovač přípony. | ||
|
||
Možná sis všiml{{a}}, že normální lomítko, `/`, nesmí na Windows být ve jménu | ||
souboru. | ||
Spousta moderních programů (včetně většiny knihoven v Pythonu) toho využívá a | ||
dopředná lomítka automaticky zaměňuje za zpětná. | ||
Můžeš tak na všech systémech používat stejné relativní cesty: `Documents/archiv.tar.gz` většinou funguje i na Windows. | ||
|
||
|
||
## Přípony | ||
|
||
Hodně jmen souborů obsahuje tečku a za ní krátkou *příponu* (angl. *extension*), | ||
která tradičně indikuje formát souboru – způsob, | ||
kterým jsou v souboru zakódovány informace. | ||
Například soubor `hrad.jpeg` má příponu `.jpeg`. | ||
Ten kdo ví, že [JPEG](https://cs.wikipedia.org/wiki/JPEG) je způsob zakódování | ||
obrázku (zvlášť vhodný pro fotografie), si tak může domyslet že v souboru je | ||
nejspíš fotka hradu. | ||
|
||
Pythonisti zase poznají příponu `.py`. | ||
Python samotný ji vyžaduje: příkaz `import module` hledá soubor `module.py`. | ||
|
||
Přípony jsou zvlášť důležité na Windows, kde se podle nich vybírá program, | ||
kterým se soubor otevře. | ||
(Unix se oproti tomu dívá v prvé řadě na samotný obsah souboru.) | ||
|
||
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). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
title: Souborové systémy | ||
style: md | ||
attribution: Petr Viktorin, 2018-2019 | ||
license: cc-by-sa-40 |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Řekl bych, že všechny systémy (Unix/Win) mají samostatný/zvláštní/oddělený souborový systém pro každý disk. Tedy kromě speciálních FS, které se dají natáhnout přes více fyzických disků.
Bez zabíhání do detailů bych řekl, že to hlavní k vysvětlení tady je, že na Windows má každý disk/FS vlastní kořenový adresář a na Unixu je ten hlavní opravu jen jeden.
Co třeba jen: Windows mají na rozdíl od Unixu zvláštní kořenový adresář pro každý disk – třeba
C:\
aD:\
– zatímco na Unixu je hlavní kořenový adresář jen jeden a disky jsou v něm připojené jako speciální adresáře.