Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

 

Predchádzajúci článok
Riešené úlohy k 6.-8. lekciu práca so súbormi v Pythone
Všetky články v sekcii
Práca so súbormi v Pythone
Preskočiť článok
(neodporúčame)
Súbory a cesty v Pythone
Článok pre vás napísal Attila
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Attila Csontos
Aktivity