Lekce 2 - Úvod do práce se soubory v Pythonu
V minulé lekci, Výjimky v Pythonu, jsme si vysvětlili výjimky, které k práci se soubory nutně potřebujeme, protože díky nim můžeme reagovat na případné chyby.
Dnes si povíme něco o souborech obecně a o právech k zápisu v systémech Windows. Po dočtení tohoto Python tutoriálu budete připraveni se soubory pracovat.
Data, resp. objekty uložené v paměti, se samozřejmě s vypnutím aplikace ztratí. Pokud chceme zajistit, aby data byla tzv. perzistentní (trvalá), musíme je při ukončení programu uložit a při načtení programu opět načíst. K ukládání dat aplikace existuje mnoho způsobů, každý má nějaké výhody a nevýhody. Obecně můžeme ukládat data naší aplikace následujícím způsobem:
- Textové soubory s plochou strukturou (tzv. flat files, např. .txt a .csv)
- textové soubory s vnitřní hierarchií (např. .xml nebo .json)
- Soubory binárního typu (jednoduše otisk paměti do souboru)
- Databáze
Každý způsob uložení dat má své výhody a nevýhody. My si jednotlivé způsoby v Python kurzu podrobně popíšeme a hlavně vyzkoušíme. Zaměříme se zejména na to, jak do souborů ukládat objekty a poté je znovu načítat. Databázím se poté věnuje samostatná sekce.
Práva k zápisu v systémech Windows
Od Windows Vista existuje v systémech Windows tzv. UAC (User Account
Control). Technologie zakazuje zápis na systémový oddíl disku (nejčastěji
C:\
) v případě, že zápis není povolen administrátorem nebo
že se nejedná o zápis do osobních složek uživatele. Toto opatření
samozřejmě naplnilo diskuzní fóra o programování a rozbilo řadu
aplikací. Důležité však je, že toto opatření je správné a
pouze zabraňuje špatně napsaným aplikacím měnit co se jim
zlíbí. Linuxové systémy mají podobná opatření již dlouhou
dobu.
Koncepce systému Windows zahrnuje uživatelské účty.
Každý uživatelský účet je realizován složkou (většinou
C:\users\jmeno_uzivatele
). Tato složka obsahuje mimo jiné
dokumenty, pracovní plochu a také tzv. složku s daty aplikací. K této
složce se lze dostat při zadání klíče %appdata%
do cesty.
Zkuste si %appdata%
napsat do cesty průzkumníka a složku
otevřít. Uvidíte, že ve složce má své podsložky mnoho aplikací, které
máte nainstalovány. Právě zde je místo pro nastavení vašich
aplikací a další data. Vaše aplikace si zde samozřejmě vytvoří
složku se svým jménem a do té si bude vše ukládat. Nebudeme omezováni UAC
a zároveň bude naše aplikace umožňovat jiné nastavení pro různé
uživatele, aniž bychom to v Pythonu programovali. %appdata%
míří vždy k appdata aktuálně přihlášeného uživatele.
Velkou chybou bylo, že si programy ukládaly data do složky s programem.
Program na ploše nebo na starých Windows fungoval, nicméně když se poté
nainstaloval do složky program files/
na disku C, spadl s chybou
při zápisu na disk. Windows tento zápis částečně pro určité aplikace
emulovala, ale tím se nebudeme zabývat. Problém lze samozřejmě obejít
tím, že aplikaci spustíme jako správce, ale to je špatné řešení.
V této lekci si ukážeme, jak vytvořit v appdata složku pro naši aplikaci. V dalších lekcích již v kódu tato logika nebude obsažena a budou sloužit jako co nejjednodušší ukázka práce se soubory. Pokud budete aplikaci provozovat na svém počítači, nemusíte se o nic starat. Jakmile ji však budete publikovat, je vhodné ji upravit tak, aby appdata používala.
Již tedy víme, kam budeme zapisovat. Výjimky jsme si uvedli také. Přesuňme se tedy k samotné práci se soubory.
IO stream a open()
V Python existuje tzv. stream, což je obecný "datový proud". Na proud se
napojíme a můžeme z něj poté načítat data nebo do něj data naopak
zapisovat. Proud je teoreticky univerzální a ten samý proud se může
nacházet v paměti RAM nebo v souboru na disku. Práce se soubory je tedy
realizována právě přes stream v knihovně io
. Nebyl by to
Python, kdyby nám nějakým způsobem práci neulehčil a proto existuje funkce
open()
, která za nás souborový proud otevře. Knihovnu
io
tedy ani potřebovat nebudeme.
V tomto kurzu se budeme v každé lekci zabývat jedním typem souboru a
vždy si ukážeme, jak s ním pracovat. Nyní si ukažme naprostý základ
toho, jak vytvořit pro naši aplikaci složku v appdata aktuálního
uživatele. Budeme k tomu používat funkci os.mkdir()
, která nám
vytvoří složku. Dále se podíváme i samotnou funkci open()
.
Tak můžeme data (např. soubor nastaveni.dat
) vytvořit s
výchozími hodnotami nebo je načíst. Pro práci s cestou použijeme
os.path
. Všechny tři funkce/knihovny budou podrobně vysvětleny
v samostatné lekci, nyní si ukážeme jen to nezbytné. Pojďme tedy napsat
aplikaci, která bude mít vlastní složku v AppData a podívá se, jestli
existuje její soubor databaze.dat
:
import os cesta = "" try: cesta = os.path.join(os.getenv("APPDATA"), "ITnetwork") if not os.path.exists(cesta): os.mkdir(cesta) except: print("Nepodařilo se vytvořit složku {0}, zkontrolujte prosím svá oprávnění.".format(cesta)) if os.path.exists(os.path.join(cesta, "databaze.dat")): try: # Zde umístěte kód pro načtení vašeho nastavení ze souboru pass except Exception as e: print("Při načítání nastavení došlo k následující chybě: {0}".format(e)) else: try: # Zde umístěte kód pro vytvoření vašeho nastavení pass except Exception as e: print("Při vytvoření nastavení došlo k následující chybě: {0}".format(e)
Nejprve si uložíme cestu ke složce s naší aplikací do textového
řetězce cesta
. Lokaci appdata získáme pomocí:
os.getenv("APPDATA")
Python si sám najde cestu k %appdata%
v prostředí, která
bude něco takového (záleží na verzi Windows):
C:\Users\vase_jmeno\AppData\Roaming
Do cesty přidáme ještě složku se jménem naší aplikace. Jméno jsem
zvolil ITnetwork/
, samozřejmě si ho poté upravte. Abychom
nemuseli přemýšlet, zda cesty obsahují na konci lomeno nebo jestli má být
lomeno zpětné nebo obyčejné, spojíme cestu pomocí funkce
os.path.join()
v knihovně os
(používáme pouze
tehdy, pokud chceme pracovat se soubory na více platformách, jakmile této
funkci jako parametr/argument předáme například "C:\\"
, funkce
ztrácí význam). V cesta
je tedy nyní toto:
C:\\Users\\vase_jmeno\\AppData\\Roaming\\ITnetwork
Pokud daná složka neexistuje (jedná se o první spuštění aplikace), tak ji vytvoříme. Dále se podíváme, zda existuje soubor, ze kterého chceme data načítat. Pokud ano, provedeme načtení dat. Pokud ne, soubor vytvoříme a nahrajeme do něj výchozí data. Nebo soubor vytvářet ani nebudeme, záleží na typu aplikace.
Po spuštění kódu se nám ve složce %appdata%
objeví nová
složka:
Máme tedy rychlý úvod, jak správně ukládat data aplikace. O výjimkách jsme si také řekli. Ještě raději zopakuji, že v následujících lekcích kvůli jednoduchosti nebudu řešit zápisová práva a programy budou fungovat jen ve složkách uživatele (např. při spuštění z vašeho IDE). Vždy se tedy vraťte sem a kód si upravte, pokud hotovou aplikaci budete chtít šířit.
V další lekci, Práce s textovými soubory v Pythonu, si ukážeme práci s prvním formátem souborů, budou to textové soubory.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 178x (474 B)
Aplikace je včetně zdrojových kódů v jazyce Python