8
votes

Lecture du tableau de configuration dans Python

J'ai un problème. Mon programme utilise le fichier de configuration pour définir des options et une de ces options est un tuple. Voici ce que je veux dire: xxx

etc ... Puis-je analyser cela en tuple avec le module ConfigParser à Python? Y a-t-il un moyen facile de faire cela?


0 commentaires

7 Réponses :


1
votes

Je ne connais pas Configpargers, mais vous pouvez facilement la lire dans une liste (peut-être utiliser .append () ), puis faire myeuple = tuple (myList)


0 commentaires

3
votes

Vous pouvez obtenir la liste des articles et utiliser une compréhension de liste pour créer une liste de tous les éléments que le nom commence par un préfixe défini, dans votre cas dossier xxx < / p>


3 commentaires

Cette solution suppose que les entrées du fichier sont dans le bon ordre.


@Terrel Shumway est le cas, mais vous pouvez toujours trier les objets à l'avance.


Tri à l'avance ne vous aidera pas: Dossier [10]



6
votes

Votre configuration pourrait être: xxx pré>

supposant que vous avez configuré dans un fichier nommé FOO.CFG, vous pouvez procéder comme suit: P>

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)


2 commentaires

Je conviendrais que dans le général Eval () n'est pas bon. Dans le cas où vous contrôlez l'entrée et restreindre l'environnement d'exécution, il s'agit d'une solution acceptable.


Mal non, gobsmacking dangereux oui. La clé de l'utilisation plus sûre de EVAL () consiste à garantir que vous avez spécifié les paramètres globaux et locaux à Eval (). Voir docs.pytthon.org/2/library/fonctions.html#eval Pour plus de détails.



1
votes
#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))

0 commentaires

12
votes

Si vous pouvez modifier le format de configuration comme celui-ci:

config.get("common", "folder").split("\n")


0 commentaires

3
votes

Créer la configuration:

tuple(json.loads(config.get('common', 'folders')))


0 commentaires

1
votes

Vous pouvez rester à JSON complètement

tts.json xxx

puis travaillez avec celui-ci xxx < / pré>


0 commentaires