web-dev-qa-db-fra.com

Itérer sur les sections d'un fichier de configuration

J'ai récemment découvert le configparser de la bibliothèque. Je voudrais pouvoir vérifier si chaque section a au moins une valeur booléenne définie sur 1. Par exemple:

[Horizontal_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 0

Ce qui précède provoquerait une erreur.

[Vertical_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 1

Ce qui précède passerait. Voici un pseudo-code de ce que j'avais en tête:

exit_test = False
for sections in config_file:
    section_check = False
    for name in parser.options(section):
        if parser.getboolean(section, name):
            section_check = True
    if not section_check:
        print "ERROR:Please specify a setting in {} section of the config file".format(section)
        exit_test = True
    if exit_test:
        exit(1)

Des questions:

1) Comment puis-je effectuer la première boucle for et répéter les sections du fichier de configuration?

2) Est-ce une bonne façon de procéder ou existe-t-il une meilleure façon? (S'il n'y en a pas, veuillez répondre à la première question.)

21
Marmstrong

En utilisant ConfigParser vous devez analyser votre configuration.

Après l'analyse, vous obtiendrez toutes les sections en utilisant la méthode .sections() .

Vous pouvez parcourir chaque section et utiliser .items() pour obtenir toutes les paires clé/valeur de chaque section.

for each_section in conf.sections():
    for (each_key, each_val) in conf.items(each_section):
        print each_key
        print each_val
55
Nilesh

Le meilleur pari est de charger TOUTES les lignes du fichier dans une sorte de tableau (je vais ignorer la question de la quantité de mémoire qui pourrait utiliser et de la page à la place).

Ensuite, à partir de là, vous savez que les lignes désignant les en-têtes suivent un certain format, vous pouvez donc parcourir le tableau pour créer un tableau d'objets contenant le nom de l'en-tête; l'index de ligne (référence de base zéro au tableau maître) et si cet en-tête a une valeur définie.

De là, vous pouvez parcourir ces objets en référence croisée au tableau maître, et pour chaque en-tête, vérifiez les "n" lignes suivantes (dans le tableau maître) entre l'en-tête actuel et le suivant.

À ce stade, vous en êtes aux valeurs de configuration individuelles pour cette rubrique, vous devriez donc pouvoir facilement analyser la ligne et détecter une valeur, après quoi vous pouvez rompre la boucle si vrai, ou pour plus de robustesse, émettez une vérification d'exclusivité sur celles-ci. les valeurs de l'en-tête afin de s'assurer qu'une seule valeur est définie.

En utilisant cette approche, vous avez accès à toutes les lignes, avec un objet par en-tête, de sorte que votre code reste flexible et fonctionnel. Optimisez ensuite.

J'espère que cela a du sens et est utile.

1
user3360243