10. diel - Práca so súbormi INI v Pythone
V predchádzajúcom cvičení, Riešené úlohy k 6.-8. lekciu práca so súbormi v Pythone, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnej lekcii preberieme štruktúru inicializačného súboru a jeho využitie. Povieme si niečo k jeho formátu a ako so súborom pracovať pomocou knižnice ConfigParser.
Čo je súbor INI?
Súbor INI je konfiguračný súbor pre počítačový softvér, ktorý sa skladá z textového obsahu so štruktúrou a syntaxou obsahujúcou pary kľúč – hodnota pre vlastnosti a sekcie, ktoré organizujú vlastnosti. Názov týchto konfiguračných súborov pochádza z prípony súboru INI, pre inicializáciu, používaného v operačnom systéme MS-DOS, ktorý popularizoval tento spôsob konfigurácie softvéru. Formát sa stal neformálnym štandardom v mnohých kontextoch konfigurácie, ale mnoho aplikácií na iných operačných systémoch používa rôzne prípony názvov súborov, ako je conf a cfg.Kde sa využíva
Konfiguračné súbory sú v oblasti výpočtovej techniky používané na konfiguráciu parametrov a počiatočných nastavení niektorých počítačových programov. Používajú sa pre užívateľské aplikácie, serverové procesy a nastavenia operačného systému.- Inicializačný súbor Windows (Windows Initialization
File) je konfiguračný súbor používaný na inicializáciu nastavenia
programu, v ktorom sú jednotlivé záznamy oddelené novým riadkom. Napríklad
desktop.ini
je skrytý súbor umiestnený v priečinkoch Windows, ktorý ukladá možnosti zobrazenia pre konkrétny priečinok. - Súbor predvolieb vytvorený programom Finale (Finale Preferences File), hudobným notovým programom. Obsahuje nastavenia programu Finale na prispôsobenie pracovného prostredia. Nastavenia zahŕňajú dialógové okná, nastavenia ponúk a štýly písma. Nastavenie prednastavené vo Finale, je možné upraviť buď pomocou dialógových okien nastavenia alebo ručne.
- Súbor nastavení zvukovej banky Gravis UltraSound (Gravis UltraSound Bank Setup File) (súbor .FFF) a tiež záplatovacie (patch) súbory používané zvukovými kartami Gravis.
- Viacjazyčné verzie aplikácií a programov. V takom prípade len stačí vytvoriť patričný počet súborov (alebo jeden súbor s viacerými sekciami), pričom v každom z nich bude slovník hesiel v jednom jazyku. Funkcia v aplikácii alebo v programe potom podľa zvoleného jazyka klienta otvorí ten správny súbor alebo sekciu.
Aký má formát
Súbor INI nemá striktne daný formát a preto sa jeho zápis líši od implementácie k implementácii.Sekcia
Kľúče môžu, ale nemusia byť zoskupené do ľubovoľne pomenovaných sekcií. Názov sekcie sa píše na riadku samostatne v hranatých zátvorkách [ a ]. Všetky kľúče za deklaráciou sekcie sú pridružené k tejto sekcii. Neexistuje žiadny explicitný oddeľovač "koniec sekcie", sekcia končí na deklarácii ďalšej sekcie alebo na konci súboru. V niektorých prípadoch je možné sekcie aj vnoriť:[sekce] [sekce.podsekce] ; podsekce vnořená do sekce [.podsekce] ; podsekce s relativním názvem vnořená do sekce
Kľúče (vlastnosti)
Základným prvkom obsiahnutým v súbore INI je kľúč alebo vlastnosť. Každý kľúč má názov a hodnotu, ktoré sú oddelené znakom rovná sa =. Niektoré implementácie umožňujú dvojbodku :. V implementácii Windows sú znamienko rovnosti a bodkočiarka vyhradené znaky a nemôžu sa objaviť v kľúči. Hodnota môže obsahovať ľubovoľný znak. Úvodné a koncové medzery okolo vonkajšej časti názvu vlastnosti sú ignorované:jméno_klíče1 = hodnota1 jméno_klíče2 = hodnota2
Rozlišovanie malých a veľkých písmen
V názvoch sekcií a vlastností sa v implementácii Windows nerozlišujú veľké a malé písmená, ale iné aplikácie sa môžu správať odlišne.Komentáre
Stredníky ; na začiatku riadku označujú komentár. Riadky komentárov sú ignorované. Tiež sa za komentár v niektorých programoch môže považovať znak #. V niektorých implementáciách môže komentár začínať kdekoľvek na riadku za medzerou (vložené komentáre), vrátane na rovnakom riadku za vlastnosťami alebo deklaráciami oddielu:; text komentáře #var = a var = a ; Toto je vložený komentář foo = bar # Toto je další vložený komentář
Duplicitné mená
Väčšina implementácií podporuje iba jednu vlastnosť s daným názvom v sekcii. Druhý výskyt názvu vlastnosti môže spôsobiť prerušenie, môže byť ignorovaný (a hodnota vyradená) alebo môže prepísať prvý výskyt (prvá hodnota bude vyradená). Niektoré programy používajú duplicitné názvy vlastností na implementáciu vlastností s viacerými hodnotami. Interpretácia viacerých deklarácií sekcie s rovnakým názvom sa tiež líšia. V niektorých implementáciách duplicitné sekcie jednoducho zlúčia svoje vlastnosti, ako by sa vyskytovali súvisle. Iní môžu prerušiť alebo ignorovať niektoré aspekty súboru INI.Znak escape
Niektoré implementácie ponúkajú rôznu podporu pre znak escape, obvykle so spätnou lomkou \ podľa syntaxe C.Príklad ini súboru
V tomto prípade ide o štruktúru rozdelenú do sekcií:[MySQL] host = localhost user = my_user pass = my_heslo name = my_test [PgSQL] host = 127.0.0.1 user = root pass = 1234 name = pg_test
Existuje aj vnútorná štruktúra plochá, ktorá neobsahuje názvy sekcií. Jej formát vyzerá nasledovne:
host = localhost user = kit pass = kitovoheslo name = test
Ako sa s ním pracuje
Súbory INI je možné upraviť pomocou textového editora a zmeniť tak konkrétne nastavenia. Zmena súboru INI však môže spôsobiť, že operačný systém alebo iné programy nebudú fungovať správne. Preto nezabudnite súbor zálohovať a upravovať súbor iba vtedy, ak presne viete, čo pridať alebo zmeniť.Vytvorenie a zmena INI súboru so sekciami
Ukážeme si ako si môžeme vytvoriť, prípadne zmeniť INI súbor. Aj keď sa tento formát súborov hodí primárne na ukladanie konfiguračných parametrov, ktoré obvykle nepotrebujeme programovo meniť. Občas sa hodí keď si súbor nemusíme sami pripravovať, a hlavne keď máme hotové pole o viacerých prvkoch:from configparser import ConfigParser # from ConfigParser import ConfigParser # ver. < 3.0 config = ConfigParser() sekce_modra = {'#0000FF' : 'Blue', '#8A2BE2' : 'BlueViolet', '#5F9EA0' : 'CadetBlue'} sekce_tmava = {'#00008B' : 'DarkBlue', '#008B8B' : 'DarkCyan', '#B8860B' : 'DarkGoldenRod'} # pridaní novej sekcie config.add_section('sekce_modra') config.add_section('sekce_tmava') # .items vracia všetky kľúč-hodnoty slovníka ako list of tuples list(sekce_modra.items()) list(sekce_tmava.items()) # potom cez ne vieme takto iterovať a pridávať hodnoty for klic, hodnota in sekce_modra.items(): config.set('sekce_modra', klic[1:], hodnota) for klic, hodnota in sekce_tmava.items(): config.set('sekce_tmava', klic[1:], hodnota) # uloženie do súboru with open('priklad.ini', 'w') as configfile: config.write(configfile)
Výsledkom bude súbor INI obsahujúci dve sekcie s tromi kľúčmi:
[sekce_modra] 0000ff = Blue 8a2be2 = BlueViolet 5f9ea0 = CadetBlue [sekce_tmava] 00008b = DarkBlue 008b8b = DarkCyan b8860b = DarkGoldenRod
Názov kľúča sme v tomto prípade exportovali bez prvého znaku, inak by sme mali kľúče znefunkčnené komentárom.
Načítanie údajov z INI súboru so sekciami a jeho výpis
Na načítanie súboru použijeme knižnicu ConfigParser. Jej implementácia je veľmi jednoduchá. Nasledujúci príklad načíta hodnotu nami zadaného kľúča zo súboru INI:from configparser import ConfigParser config = ConfigParser() config.read('priklad.ini') # načítanie hodnoty nami zadaného kľúča barva = '#8A2BE2' hodnota = config.get('sekce_modra', barva[1:]) print(hodnota)
Alebo na výpis všetkých záznamov a sekcií môžeme použiť nasledujúci kód:
from configparser import ConfigParser config = ConfigParser() config.read('priklad.ini') # výpis všetkých záznamov hodnota = {section: dict(config.items(section)) for section in config.sections()} print(hodnota)
Dostaneme výpis všetkých záznamov ako dvojrozmerný slovník:
Konzolová aplikácia
{
'sekce_modra' : {
'0000ff' : 'Blue',
'8a2be2' : 'BlueViolet',
'5f9ea0' : 'CadetBlue'
},
'sekce_tmava' : {
'00008b' : 'DarkBlue',
'008b8b' : 'DarkCyan',
'b8860b' : 'DarkGoldenRod'
}
}
Na výpis názvov sekcií môžeme použiť nasledovný zápis:
from configparser import ConfigParser config = ConfigParser() config.read('priklad.ini') # výpis sekcií hodnota = config.sections() print(hodnota)
Dostaneme výpis sekcií:
Konzolová aplikácia
['sekce_modra', 'sekce_tmava']
Poznámka na záver
Obľúbenou voľbou pre kódovanie konfigurácie v textových súboroch sa stali konfiguračné súbory založené na XML. V poslednej dobe môžu ako konfiguračné formáty slúžiť formáty ako sú JSON, TOML a YAML. Najnovšie INI analyzátory však umožňujú rovnakú ľubovoľnú úroveň vnorenia ako XML, JSON, TOML a YAML. Ponúkajú ekvivalentnú podporu typovaných hodnôt a Unicode, aj keď zachovávajú "neformálny stav" súborov INI tým, že umožňujú viac syntax pre vyjadrenie rovnakej veci.V ďalšej lekcii, Súbory a cesty v Pythone , sa budeme venovať základnej práci s cestami a súbormi v Pythone a preberieme aj atribúty súborov.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 13x (1.99 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python