środa, 4 lutego 2015

Python: czytanie plików ini

Python to język pozwalający na całkiem sprawne i szybkie rozwiązywanie wielu problemów. Już kilka razy tworzyłem przy jego pomocy aplikacje pracujące na dużych zbiorach danych, łączące się z bazami, czy przetwarzające strumienie audio/video. W większości przypadków aplikacje korzystały z konfiguracji w plikach ini.


Niezwykle wygodne są dla mnie pliki w tym formacie. Generalnie większość rzeczy da się w nich spokojnie opisać. Praktycznie wszędzie istnieją narzędzia do łatwego odczytywania plików w tym formacie. Python nie jest odstępstwem od tej reguły i dostarcza moduł do pracy z plikami INI.

Wspomniany moduł to configparser (w 3.4, a wcześniej znany jako ConfigParser). Dostarcza on klasę ConfigParser, której użycie jest banalnie proste.

Załadowanie pliku INI to parę linii:
from configparser import ConfigParser
config = ConfigParser()
config.read('config.ini')

Dane z tak załadowanej konfiguracji można odczytać jak ze zwykłego słownika:
config['path']

znacznie przyjemniejsze jest jednak użycie metody, która pozwala na pozyskanie wartości domyślnej, jeśli konfiguracja nie zawiera poszukiwanego ustawienia (tzw. fallback value):
config.get('path', '.')

Konfiguracja może, a w zasadzie powinna składać się z sekcji. Najważniejsza z nich to DEFAULT. Ta sekcja powinna zawierać wszystkie ustawienia jakie mogą pojawić się w sekcjach i ich wartości domyślne. Jeśli w innej sekcji nie uda się odnaleźć wartości dla poszukiwanego ustawienia, sprawdzana jest właśnie sekcja DEFAULT. Co ważne, ma ona wyższy priorytet niż fallback value.

Przykładowo plik ini:
[DEFAULT]
domain = alamakota.pl
pass = ""

[production]
pass = s3cr3t

Kod python:
from configparser import ConfigParser
config = ConfigParser()
config.read('config.ini')
config.get('production', 'domain')

zwróci:
"alamakota.pl"

Czyli wartość odczytaną nie z production, a z DEFAULT. Jak już wspominałem możliwe jest skorzystanie z ConfigParser jak ze słownika. Warto jednak pamiętać, że jeśli korzystamy z sekcji w pliku ini, to słownik będzie miał 2 poziomy, a nie jeden. Aby więc dostać się do jakiegoś ustawienia, musimy najpierw odwołać się do środowiska, a później do samego ustawienia po nazwie. Zaprezentowany wcześniej przykład możemy zapisać jako:
config['production']['domain']

Tak samo jak wcześniej uzyskamy wartość zapisaną w sekcji DEFAULT. Trzeba jednak pamiętać, że w tym przypadku jesteśmy skazani na przechwytywanie wyjątków. Jeśli spróbujemy odwołać się do sekcji, która nie istnieje, lub do nie istniejącego ustawienia rzucony zostanie wyjątek KeyError. Użycie w tym przypadku funkcji get generuje znacznie mniej utrudnień. Wyjątek rzucony zostanie przez nią zawsze jeśli odwołamy się do nieistniejącej sekcji, ale odwołanie do nie istniejącego ustawienia generuje wyjątek tylko, jeśli nie dostarczymy fallback value.

Brak komentarzy:

Prześlij komentarz