2010-10-22 11 views

Répondre

7
d = {} 
with open('filename') as f: 
    for line in f: 
     key, value = line.split('=') 
     d[key] = value 

Edit:?. Comme suggéré par foret, vous pouvez changer à

for line in f: 
     tokens = line.split('=') 
     d[tokens[0]] = '='.join(tokens[1:]) 

qui traiterait le cas où le signe égal ont été autorisés dans la valeur, mais toujours d'actualité si le nom pourrait avoir le signe égal et - pour que vous auriez besoin d'un véritable analyseur.

+2

Vous pouvez simplement faire 'pour line in f'. –

+0

Oui, par inadvertance manqué cela, merci. – user470379

+2

Que faire si la valeur contient '='? =) – foret

9

Peut-être que ConfigParser peut vous aider.

+0

+1 Ceci est probablement la meilleure réponse pour vos besoins. – hughdbrown

+10

-1 Sauf que ConfigParser lancera une erreur NoSectionError s'il n'y a aucun en-tête de section. – samwyse

2

Le csv module vous permettra de le faire assez facilement:

import csv 
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=')]) 
+0

J'ai répondu à une autre question avec un exemple de code utilisant ce type d'approche. http://stackoverflow.com/a/13019292/742019 –

20

La réponse oneliner:

H = dict(line.strip().split('=') for line in open('filename.txt')) 

(si les valeurs pourraient également contenir le cas échéant utiliser .split() avec maxsplit=1 le caractère "=")

+0

Je suis désolé, mais c'est un -1. Cela n'obéit pas à plusieurs choses qui sont valides par la grammaire qui est valide pour un fichier de propriétés.Consultez le lien suivant pour plus de détails sur ce qui manque à cette réponse: https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0204propertiesfileformat01.html. Les fichiers de propriétés, semblables à JSON, n'ont pas une grammaire très complexe, mais vous devez y obéir tout de même. – searchengine27

2

cela peut être une réponse stupide, mais qui sait peut-être qu'il peut vous aider :)

changer l'extension de votre fichier .py, et faire les changements nécessaires comme ceci:

file.py

VarName="Value" # if it's a string 
VarName_2=1 
# and you can also assign a dict a list to a var, how cool is that ? 

et le mettre dans votre arbre paquet ou sys.path, et maintenant vous peut l'appeler comme ça dans le script lorsque vous souhaitez utiliser:

>>> import file 
>>> file.VarName 
'Value' 

pourquoi je vous écris cette réponse c'est parce que, ce que l'enfer est ce dossier? je ne vois jamais un fichier conf comme celui-ci, pas de section non rien? Pourquoi voulez-vous créer un fichier de configuration comme celui-ci? ça ressemble à un mauvais fichier de configuration qui devrait ressembler aux paramètres de Django, et je préfère utiliser un fichier de configuration de type django quand je le peux.

Maintenant, vous pouvez mettre votre -1 dans la gauche :)

+0

C'est un fichier de propriétés Java. Assez standard, ce qui fait qu'il est dommage que ConfigParser lève un NoSectionError s'il n'y a pas de sections. Je devrais soumettre une demande de fonctionnalité pour cela. – samwyse

+0

Je fais comme si vous pensiez en dehors de la boîte, mais cela va se casser sur une ligne comme 'VarName: value', qui à la fois casse sur le caractère': ', et le fait que votre' value' n'a pas de guillemets il. – searchengine27

+0

De même, les fichiers @samwyse: .cfg, bien qu'ils ne soient pas centralisés dans une grammaire formelle comme un fichier .properties, sont généralement interprétés différemment de .properties. 'ConfigParser' est une librairie pour comprendre les fichiers .cfg, donc si vous écrivez un bogue contre cette librairie pour ne pas lire .properties, ils risquent de le renvoyer et de le rejeter - je le ferais de toute façon. Les fichiers .properties ne sont pas la responsabilité d'un analyseur .cfg. Les fichiers .cfg nécessitent l'existence d'une section dans la plupart des gestionnaires .cfg, c'est pourquoi cette exception est levée. – searchengine27

8

Prendre @ réponse de Steven ne tient pas compte des commentaires et des sauts de ligne dans le fichier de propriétés, celui-ci fait:

H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n')) 
+0

Je suis désolé mais cela a le même problème que @Steven. Si cela obéissait à la grammaire je supprimerais la downvote, ou si la réponse au moins reconnu que ce n'est pas l'analyse d'un fichier de propriétés. – searchengine27

0

Si vous avez besoin pour lire toutes les valeurs d'une section dans le fichier de propriétés d'une manière simple:

Votre config.fichier de propriétés mise en page:

[SECTION_NAME]

clé1 = valeur1

key2 = valeur2

code Vous:

import configparser 

    config = configparser.RawConfigParser() 
    config.read('path_to_config.properties file') 

    details_dict = dict(config.items('SECTION_NAME')) 

Cela vous donnera un dictionnaire où les clés sont les mêmes que dans le fichier de configuration et leurs valeurs correspondantes.

details_dict est:

{'key1':'value1', 'key2':'value2'} 
1

Pour python2 il y a un jproperties https://pypi.python.org/pypi/jproperties/1.0.1

Pour python2/3 il y a javaproperties http://javaproperties.readthedocs.io/en/v0.1.0/

aussi simple que:

import os, javaproperties 
with open(file, 'rb') as f: 
    properties_dict = javaproperties.load(f) 
+0

C'est honnêtement la seule solution complète qui résout à 100% le problème de l'OP. Le seul problème pourrait être l'utilisation de bibliothèques tierces qui pourraient être restreintes par son organisation, comme c'est souvent le cas dans le monde de l'entreprise. Une solution que j'ai pour le même problème nécessite l'utilisation d'une bibliothèque séparée aussi, donc je n'ai pas une meilleure solution à cela, nécessairement - juste différent. – searchengine27

0

personne OK d'autre dans les réponses l'a mentionné, donc je suppose que je vais. Si vous écrivez Python et contrôlez votre interpréteur, vous pouvez peut-être forcer l'utilisation de l'interpréteur Jython.

Jython est un interpréteur Python implémenté entièrement en Java. Vous avez toutes les bibliothèques standard Python à portée de main, avec l'avantage supplémentaire de toutes vos bibliothèques Java SE disponibles.

Je n'ai exécuté aucun des éléments suivants (je pense plutôt à du code psudeo sans gestion des exceptions), mais vous pouvez mélanger et faire correspondre des bibliothèques Python et Java, et votre code pourrait ressembler à ceci:

from java.util import Properties 
from java.io import File, FileInputStream 
import os 
javasPropertyObject = Properties() 
pathToPropFile = os.path.join('path', 'to', 'property', 'file.properties') 
if os.path.isfile(pathToPropFile): 
    #this is java.io.File, not Python's file descriptor 
    propFile = File(pathToPropFile) 
    javasFileInputStreamObject = FileInputStream(propFile) 
    javasPropertyObject.load(javasFileInputStreamObject) 

    #now we can pull out Java properties as defined by the .property file grammar 
    myProp = javasPropertyObject.getProperty('myPropName') 

où un fichier comme celui-ci sera valide, qui ne serait pas dans les split on '=' simples solutions:

myPropName1:value 
myPropName2=value 
myPropName3=\ 
value 
#this is a = comment 
myPropName4:my \ 
value 
myPropNameWithUnicode=\u0009 

L'inconvénient est que vous perdez votre capacité à être portable entre différents interprètes Python et maintenant vous êtes enfermé dans Jython . Vous seriez enfermé dans une bibliothèque si vous essayez cette approche également. La raison pour laquelle j'aime Jython est que vous avez plus de flexibilité avec toutes les bibliothèques Java SE disponibles.