Pitone

Come leggere e scrivere file INI e Conf usando Python

Come leggere e scrivere file INI e Conf usando Python
Il linguaggio di programmazione Python viene fornito con un utile modulo integrato chiamato "ConfigParser" che può essere utilizzato per scrivere in modo pulito parametri di configurazione per le app. ConfigParser utilizza un linguaggio di configurazione ben definito e strutturato completamente compatibile con i file INI presenti in Microsoft Windows. Questi file INI possono essere utilizzati anche con le app Python in esecuzione su Linux e forniscono un modo persistente per archiviare e recuperare i valori.

In Linux, è più comune vedere ".conf" rispetto a ".ini" file. I file Conf in Linux sono come qualsiasi altro file di testo e quindi possono essere strutturati in qualsiasi modo. Dipende dal parser come interpreta un ".conf" file. Il modulo ConfigParser di Python può analizzare ".conf" (o qualsiasi altra estensione casuale), a condizione che questi file siano definiti in un linguaggio di configurazione compatibile con INI. Questo articolo spiegherà la lettura e la scrittura “.conf" in Linux utilizzando l'ultima versione stabile di Python 3. Nota che se sostituisci tutte le occorrenze di ".conf" in questo articolo con ".ini", il risultato sarebbe lo stesso. Il processo e il codice spiegati di seguito dovrebbero essere per lo più compatibili anche con Microsoft Windows, con alcune piccole differenze. Anche se queste differenze non saranno trattate in questo articolo.

Modulo ConfigParser

Il parser di file di configurazione o ConfigParser è un modulo Python che consente di leggere e scrivere file di configurazione utilizzati nelle app Python. Come spiegato sopra, questo modulo supporta la sintassi dei file INI. Un molto semplicistico”.ini” / “.conf" ha questo aspetto.

[PREDEFINITO]
suono = 1
musica = 1
volume = 0.8
risoluzione = 1920x1080
[Utente]
# suono può avere 0 (falso) e 1 (vero) come possibili valori
suono = 1
; la musica può avere 0 (falso) e 1 (vero) come possibili valori
musica = 0
Volume = 0.4
risoluzione = 1280x720

L'esempio ".conf" sopra ha due sezioni, "DEFAULT" e "Utente". Di solito i programmi Python sono codificati in modo tale che i valori della sezione DEFAULT non vengano mai modificati. La sezione DEFAULT viene utilizzata per ripristinare i valori complessivi o individuali ai valori predefiniti. La sezione utente riflette le modifiche apportate da un utente finale che sta utilizzando il programma Python. Nota che i nomi delle sezioni possono essere qualsiasi cosa e non è affatto necessario avere una sezione DEFAULT. Tuttavia, ogni volta che è presente la sezione "DEFAULT" (il nome deve essere in maiuscolo), verrà utilizzata per fornire valori predefiniti in modo sicuro se ConfigParser non riesce ad analizzare determinate variabili. La logica per gestire queste sezioni, le variabili sottostanti e i valori di fallback deve essere definita nel programma Python stesso. Simboli come "#" e ";" può essere usato per indicare commenti in ".conf" file. Tutte le coppie chiave-valore nel file di configurazione non fanno distinzione tra maiuscole e minuscole, di solito scritte in minuscolo.

Gestione dei tipi di dati da parte di ConfigParser

Prima di procedere con alcuni esempi di ConfigParser, è importante comprendere la gestione dei tipi di dati da parte di questo modulo. Per ConfigParser, ogni pezzo di codice scritto o analizzato è una stringa. Non può distinguere tra numeri o qualsiasi altro formato. I programmatori devono scrivere la logica nel loro programma per convertire una stringa "1234" in un numero utilizzando int ("1234") durante la lettura dei dati da un ".conf" file.

Mentre la conversione in numeri utilizzando il metodo int e float è un compito piuttosto semplice, la conversione in booleano può essere complicata poiché Python considera bool ("any_string") come True. Per superare questo problema, puoi utilizzare le istruzioni condizionali che controllano una stringa specifica. Il modulo ConfigParser fornisce anche un metodo chiamato "getboolean()". Questo metodo può differenziare correttamente i valori booleani 'yes'/'no', 'on'/'off', 'true'/'false' e '1'/'0' anche se sono stringhe. ConfigParser include anche i metodi getint() e getfloat() per tua comodità.

Scrittura e salvataggio di un nuovo file Conf utilizzando ConfigParser

Supponiamo che il ".conf" menzionato sopra non esiste e si desidera crearlo automaticamente al primo avvio del programma. Il codice seguente creerà un nuovo "settings.conf" nella directory da cui è stato eseguito il programma Python.

import configparser
config = parser di configurazione.ConfigParser()
config['DEFAULT'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
config['Utente'] = "suono" : "1", "musica": "1",
"volume": "0.8", "risoluzione": "1920x1080"
con open('impostazioni.conf', 'w') come file di configurazione:
config.scrivere (file di configurazione)

La prima istruzione nel codice sopra importa il modulo ConfigParser. La seconda istruzione crea un oggetto simile a un dizionario chiamato "config". Ora puoi usare la sintassi standard del dizionario Python per definire sezioni e variabili incluse sotto di esse, come evidente dalle prossime due istruzioni. Infine l'istruzione "with open" crea un nuovo "settings.conf" e scrive le sezioni di configurazione nel file.

Il codice sopra funziona, ma c'è un piccolo problema con esso. Crea un nuovo file di impostazioni ogni volta che viene eseguito il programma, con conseguente sovrascrittura di qualsiasi modifica apportata dall'utente al file di impostazioni. Per risolvere questo problema, è necessario verificare due condizioni:

Il codice modificato di seguito verificherà le due condizioni e creerà un nuovo file di impostazioni solo se queste due condizioni sono soddisfatte.

import configparser
importare il sistema operativo
 
config = parser di configurazione.ConfigParser()
config['DEFAULT'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
config['Utente'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
settings_file = os.sentiero.dirname(os.sentiero.percorso reale(__file__))
+ os.set + "impostazioni.conf"
se non os.sentiero.esiste(file_impostazioni)
o os.stat(file_impostazioni).st_size == 0:
con open('impostazioni.conf', 'w') come file di configurazione:
config.scrivere (file di configurazione)

La seconda istruzione nel codice sopra importa il modulo "os". La variabile "settings_file" memorizza il percorso completo di "settings.conf" da creare nella directory dello script Python. L'istruzione successiva verifica due condizioni sopra menzionate. La prima clausola nella dichiarazione è autoesplicativa. La seconda clausola controlla se la dimensione del file è "0 byte". Un file a zero byte significherebbe un file vuoto senza dati memorizzati in esso. Il resto del codice è lo stesso del primo esempio sopra indicato.

Finora gli esempi di codice spiegati sopra salvano il file di configurazione nella directory dello script Python stesso. Tuttavia, è una pratica comune e uno standard freedesktop salvare i file di configurazione nella cartella ".config" nella cartella home. L'esempio di codice seguente creerà un nuovo "settings.conf" in "~/.cartella config/testapp”.

import configparser
importare il sistema operativo
 
app_name = "testapp"
config_folder = os.sentiero.unisciti (os.sentiero.expanduser("~"), '.config', nome_app)
os.makedirs(config_folder, exist_ok=True)
settings_file = "impostazioni.conf"
full_config_file_path = os.sentiero.join (cartella_config, file_impostazioni)
 
config = parser di configurazione.ConfigParser()
config['DEFAULT'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
config['Utente'] = "suono" : "1", "musica": "1",
"volume": "0.8", "risoluzione": "1920x1080"
 
se non os.sentiero.esiste(percorso_file_config_completo)
o os.stat(percorso_file_config_completo).st_size == 0:
con open(full_config_file_path, 'w') come file di configurazione:
config.scrivere (file di configurazione)

Il codice sopra è quasi lo stesso dell'esempio precedente, tranne per il fatto che cambia la posizione di "settings.conf" in "~/.config/testapp/settings.conf". La variabile "config_folder" memorizza il percorso completo della cartella dell'applicazione da creare in ".config" ("~/.config/testapp/”). Il “os.makedirs" creerà una nuova cartella dell'app solo se non esiste già. La variabile "full_config_file_path" memorizza il percorso completo del file delle impostazioni ("~/.config/testapp/settings.conf"). Il resto del codice è autoesplicativo.

Lettura di un file Conf utilizzando ConfigParser

L'analisi di un file di configurazione è piuttosto semplice. Il ConfigParser tenta di leggere un valore utilizzando i metodi get(), getfloat(), getboolean() o la sintassi del dizionario. In caso di errore chiave, vengono utilizzati i valori della sezione DEFAULT o i valori di fallback. È una buona pratica definire la sezione DEFAULT o i valori di fallback per prevenire errori chiave. Puoi usare anche le istruzioni try-eccetto per sopprimere gli errori.

config = parser di configurazione.ConfigParser()
config.read(percorso_file_config_completo)
 
is_sound_on = config['Utente'].getboolean('suono')
volume_level = config['Utente'].getfloat('volume')
risoluzione = config['Utente']['risoluzione']
 
# Il valore di fallback "False" verrà ignorato poiché esiste già una sezione DEFAULT.
# In assenza della sezione DEFAULT, verrà debitamente utilizzato il valore di fallback.
is_music_on = config['Utente'].getboolean('musica', False)
 
stampa (è_suono_attivo, è_musica_su, volume_livello, risoluzione)

Nell'esempio di codice sopra, "config.read" viene utilizzata per leggere i dati da un file di configurazione. Nelle seguenti istruzioni, vengono utilizzati vari metodi get incorporati e notazioni del dizionario per leggere i dati. Nella dichiarazione della variabile “is_music_on”, il secondo argomento è il valore di fallback (False). Nota che i valori di fallback avranno una precedenza inferiore rispetto ai valori definiti nella sezione DEFAULT. In parole povere, i valori di fallback non avranno alcun effetto quando una coppia chiave-valore è già presente nella sezione DEFAULT.

Codice completo

Di seguito è riportato l'intero codice che combina sia la creazione della prima esecuzione del file di configurazione che la lettura del file di configurazione.

#! /usr/bin/python3
import configparser
importare il sistema operativo
 
app_name = "testapp"
config_folder = os.sentiero.unisciti (os.sentiero.expanduser("~"), '.config', nome_app)
os.makedirs(config_folder, exist_ok=True)
settings_file = "impostazioni.conf"
full_config_file_path = os.sentiero.join (cartella_config, file_impostazioni)
 
config = parser di configurazione.ConfigParser()
 
config['DEFAULT'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
config['Utente'] = "suono" : "1", "musica" : "1",
"volume": "0.8", "risoluzione": "1920x1080"
 
se non os.sentiero.esiste(percorso_file_config_completo)
o os.stat(percorso_file_config_completo).st_size == 0:
con open(full_config_file_path, 'w') come file di configurazione:
config.scrivere (file di configurazione)
 
config.read(percorso_file_config_completo)
is_sound_on = config['Utente'].getboolean('suono')
volume_level = config['Utente'].getfloat('volume')
risoluzione = config['Utente']['risoluzione']
 
# Il valore di fallback "False" verrà ignorato poiché esiste già una sezione DEFAULT.
# In assenza della sezione DEFAULT, verrà debitamente utilizzato il valore di fallback.
is_music_on = config['Utente'].getboolean('musica', False)
 
stampa (è_suono_attivo, è_musica_su, volume_livello, risoluzione)

Conclusione

ConfigParser in Python fornisce un modo utile per gestire le impostazioni sia della riga di comando che delle app Python GUI. Questi file di configurazione possono essere utilizzati anche come database di testo leggeri, ma potrebbero non essere adatti per tipi di dati avanzati, set di dati di grandi dimensioni e un numero elevato di query.

Il pulsante centrale del mouse non funziona in Windows 10
Il tasto centrale del mouse ti aiuta a scorrere lunghe pagine web e schermate con molti dati. Se si ferma, finirai per usare la tastiera per lo scorri...
Come cambiare i pulsanti sinistro e destro del mouse su PC Windows 10
È abbastanza normale che tutti i mouse dei computer siano progettati ergonomicamente per gli utenti destrimani. Ma sono disponibili dispositivi mouse ...
Emula i clic del mouse passando il mouse utilizzando il mouse senza clic in Windows 10
L'uso di un mouse o di una tastiera nella postura sbagliata di un uso eccessivo può causare molti problemi di salute, tra cui tensione, sindrome del t...