Python: Comment créer un dictionnaire à partir d'un fichier de propriétés tout en omettant les commentaires
J'ai cherché la réponse à cette ici pendant un certain temps et n'ont pas trouvé, donc espérons que ce n'est pas dupe.
J'ai un fichier de propriétés qui contient surtout des paires valeur /clé, mais contient également des commentaires. J'ai besoin de le mettre dans un dictionnaire si je peux récupérer les valeurs à volonté. Dans un fichier, sans commentaires, le suivant fonctionne parfaitement.
myprops = dict(line.strip().split('=') for line in open('/Path/filename.properties'))
print myprops['key']
Mais pas quand il y a des commentaires présents. Si il y a #comment
présent, dictionnaire dit
"ValueError: dictionary update sequence element #x has length 1, 2 is required"
J'ai essayé d'emballage le dictionnaire de la création dans des conditions avec
if not line.startswith('#'):
Mais je n'arrive pas à obtenir que cela fonctionne. Des Suggestions? Merci!
- Donc, pour être clair, vous avez essayé de
dict(line.strip().split('=') for line in open('/Path/filename.properties') if not line.startswith('#'))
? - Je n'essayais pas tout à fait de cette façon et qui ne fonctionne pas. merci!!!!
- J'ai peut-être parlé trop vite. J'avais supposé que l'erreur était sur le compte de juste les lignes commentées. Il y a des lignes vides ainsi. Et Ça donne le même message d'erreur sur ceux-ci. J'ai pensé
line.strip()
allait sauter toutes les lignes vides.
Vous devez vous connecter pour publier un commentaire.
À l'adresse de votre nouveau contrainte sur les lignes vides, je voudrais essayer quelque chose comme:
Il est très clair et il est facile d'ajouter des contraintes supplémentaires, tandis que l'utilisation d'un dict compréhension obtiendrez assez gonflé. Cependant, vous pouvez toujours format joliment
Vous devriez utiliser le haut-
configparser
qui est faite pour lire les fichiers ini style fichiers de configuration. Il permet d'émettre des commentaires à l'aide de;
et#
par défaut, donc ça devrait marcher pour vous.Pour
.properties
fichiers que vous pourriez avoir besoin de tromper un peu comme le configparser attend généralement à ce que les noms de section. Vous pouvez le faire facilement en ajoutant un mannequin de la section lors de la lecture de bien:(En utilisant le même fichier exemple mtitan8)
Pour Python 2, utilisez
from ConfigParser import ConfigParser
à la place.test.properties
aussi n'a pas toutes les sections, de sorte que lors de la lecture du fichier, j'ai juste ajouter un mannequin dans le haut du fichier, de sorte que le configparser ne me plaindrai pas.import ConfigParser
.from configparser import ConfigParser
me donne une erreur d'importation. Cependant, j'obtiens une erreur de toute façon sur la ligne suivanteconfig = ConfigParser()
en précisant que "module" de l'objet n'est pas appelable. Je suis sur Python 2.7 si cela fait une différence en ce qui concerne cette solution. Merci.from ConfigParser import ConfigParser
en Python 2, car à l'époque le nom du module n'était pas encore en minuscules.Donné un fichier de propriétés
test.txt
comme vous l'avez décrit:Vous pouvez effectuer les opérations suivantes:
Ce qui semble juste que le code qui vous a dit que vous essayé d'utiliser
if not line.startswith('#')
, donc j'espère que cet exemple vous aidera à identifier le bug.Pourquoi cette force en une seule ligne? Deux semaines à partir de maintenant, un utilisateur va mettre un espace quelque part, ou si vous voulez utiliser les guillemets et vous devez aller vous détendre le code. Il suffit de faire une fonction qui gère l'entrée et être fait avec elle. Cela signifie également que vous pouvez utiliser des tests unitaires pour s'assurer qu'il fonctionne et des séjours de travail.
Compte tenu de cette entrée:
Le code suivant va gérer tous les joliment.
BTW, j'aime pousser la suggestion de l'utilisation de ConfigParser. Mais le hack de l'ajout d'une section peut ou peut ne pas fonctionner pour tout le monde.
Si vous souhaitez déplacer le commentaire de l'enregistrement dans le parse_line() fonction vous pouviez retourner None, None et vérifier que avant de mettre la paire clé/valeur dans le dictionnaire.
ne devrait pas
line.startswith('#')
mieux lireline.strip().startswith('#')
?