Le fichier typique généré par ConfigParser ressemble à ceci:
[Section]
bar=foo
[Section 2]
bar2= baz
Maintenant, existe-t-il un moyen d'indexer des listes comme, par exemple:
[Section 3]
barList={
item1,
item2
}
Question connexe: Clés uniques ConfigParser de Python par section
python
configparser
pistache
la source
la source
Également un peu tard, mais peut-être utile pour certains. J'utilise une combinaison de ConfigParser et JSON:
il suffit de le lire avec:
Vous pouvez même casser des lignes si votre liste est longue (merci @ peter-smit):
Bien sûr, je pourrais simplement utiliser JSON, mais je trouve les fichiers de configuration beaucoup plus lisibles et la section [DEFAULT] très pratique.
la source
key5 : [r"abc $x_i$", r"def $y_j$"]
? Ils soulèvent l'erreurjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Arriver en retard à cette fête, mais j'ai récemment mis en œuvre cela avec une section dédiée dans un fichier de configuration pour une liste:
et en utilisant
config.items( "paths" )
pour obtenir une liste itérative d'éléments de chemin, comme ceci:J'espère que cela aidera d'autres personnes à googler cette question;)
la source
; comment
sortir certains éléments de la liste sans avoir à réécrire toute la liste.key
, car ConfigParser convertit toutes ces clés en minusculesconfig = ConfigParser.SafeConfigParser()
config.optionxform = str
Ensuite, l'affaire sera laissée seuleUne chose que beaucoup de gens ne savent pas, c'est que les valeurs de configuration multilignes sont autorisées. Par exemple:
La valeur de
config.get('hello','barlist')
sera désormais:Que vous pouvez facilement diviser avec la méthode des lignes fractionnées (n'oubliez pas de filtrer les éléments vides).
Si nous regardons un grand framework comme Pyramid, ils utilisent cette technique:
La source
Moi-même, j'étendrais peut-être le ConfigParser si c'est une chose courante pour vous:
Notez qu'il y a quelques points à surveiller lors de l'utilisation de cette technique
la source
.splitlines()
place de.split()
? En utilisant le comportement par défaut de chacun, la division est clairement supérieure (filtre les lignes vides). Sauf si je manque quelque chose ...Si vous voulez passer littéralement dans une liste, vous pouvez utiliser:
Par exemple de configuration:
Le code est:
production:
la source
ast.literal_eval()
lors de la comparaison pour utiliser le (sans doute plus populaire)json.loads()
? Je pense que ce dernier offre plus de sécurité, non?Aucune mention du
converters
kwarg pourConfigParser()
dans aucune de ces réponses n'était plutôt décevante.Selon la documentation, vous pouvez passer un dictionnaire
ConfigParser
qui ajoutera unget
méthode pour l'analyseur et les proxys de section. Donc pour une liste:example.ini
Exemple d'analyseur:
C'est mon préféré car aucun sous-classement n'est nécessaire et je n'ai pas besoin de compter sur un utilisateur final pour écrire parfaitement JSON ou une liste qui peut être interprétée par
ast.literal_eval
.la source
J'ai atterri ici en cherchant à consommer ça ...
La réponse est de le diviser par la virgule et de supprimer les espaces:
Pour obtenir un résultat de liste:
Cela peut ne pas répondre exactement à la question du PO, mais pourrait être la réponse simple que certaines personnes recherchent.
la source
[email protected]
! Pas étonnant que mon courrier ne cesse de rebondir! > _ <Voici ce que j'utilise pour les listes:
contenu du fichier de configuration:
code:
ça marche pour les cordes
en cas de nombres
contenu de la configuration:
code:
Merci.
la source
Donc, une autre façon, que je préfère, est de simplement diviser les valeurs, par exemple:
Pourrait être chargé comme ceci dans une liste de chaînes ou d'entiers, comme suit:
Cette méthode vous évite d'avoir à placer vos valeurs entre crochets pour les charger en JSON.
la source
Seuls les types primitifs sont pris en charge pour la sérialisation par l'analyseur de configuration. J'utiliserais JSON ou YAML pour ce type d'exigence.
la source
J'ai été confronté au même problème dans le passé. Si vous avez besoin de listes plus complexes, pensez à créer votre propre analyseur en héritant de ConfigParser. Ensuite, vous écraseriez la méthode get avec cela:
Avec cette solution, vous pourrez également définir des dictionnaires dans votre fichier de configuration.
Mais fais attention! Ce n'est pas aussi sûr: cela signifie que n'importe qui peut exécuter du code via votre fichier de configuration. Si la sécurité n'est pas un problème dans votre projet, j'envisagerais d'utiliser directement des classes python comme fichiers de configuration. Ce qui suit est beaucoup plus puissant et consommable qu'un fichier ConfigParser:
la source
barList=item1,item2
puis appelerif value.find(',') > 0: return value.split(',')
, ou mieux encore, faire analyser toutes les options de configuration sous forme de listes, et.split(',')
tout simplement à l' aveugle?Alors maintenant mon
config.cfg
fichier, qui pourrait ressembler à ceci:Peut être analysé en objets suffisamment fins pour mon petit projet.
C'est pour une analyse très rapide de configurations simples, vous perdez toute capacité à récupérer des entiers, des booléens et d'autres types de sortie sans transformer l'objet renvoyé par
Parser
, ni refaire le travail d'analyse effectué par la classe Parser ailleurs.la source
J'ai terminé une tâche similaire dans mon projet avec une section avec des clés sans valeurs:
Production:
app.config:
la source
json.loads
&ast.literal_eval
semble fonctionner mais une simple liste dans la configuration traite chaque caractère comme un octet, ce qui renvoie même un crochet ...signifiant si la configuration a
fieldvalue = [1,2,3,4,5]
puis
config.read(*.cfg)
config['fieldValue'][0]
revenant[
à la place de1
la source
Comme mentionné par Peter Smit ( https://stackoverflow.com/a/11866695/7424596 ) Vous voudrez peut-être étendre ConfigParser, en outre, un Interpolator peut être utilisé pour convertir automatiquement dans et à partir de la liste.
Pour référence en bas, vous pouvez trouver du code qui convertit automatiquement la configuration comme:
Donc, si vous demandez des clés, vous obtiendrez:
Code:
la source