2010-10-22 7 views
10

Tengo un archivo con el formato¿cuál sería una forma rápida de leer un archivo de propiedad en python?

VarName=Value 
. 
. 

quiero leer en un hash de tal manera que H("VarName") devolverá el valor.

¿Qué sería una manera rápida? (Leer un conjunto de cadenas, divide todos ellos donde el signo de igualdad es, y luego ponerlo en un hash

estoy trabajando con el pitón

+5

http://docs.python.org/library/configparser.html? – delnan

Respuesta

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

Editar:?. Como sugiere Foret, usted podría cambiarlo a

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

que manejar el caso en el que es igual signos fueron permitidos en el valor, pero a pesar de ello un error si el nombre podría tener signos de igual, así - para que se necesitaría un verdadero analizador.

+2

Puedes hacer 'para la línea en f'. –

+0

Sí, casi lo extraño, gracias. – user470379

+2

¿Qué pasa si el valor contiene '='? =) – foret

9

Tal vez ConfigParser puede ayudarle.

+0

+1 Esta es probablemente la mejor respuesta para sus propósitos. – hughdbrown

+10

-1 Excepto que ConfigParser lanzará un NoSectionError si no hay encabezados de sección. – samwyse

2

El csv module le permitirá hacer esto con bastante facilidad:

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

Respondí otra pregunta con una muestra de código usando este tipo de enfoque. http://stackoverflow.com/a/13019292/742019 –

20

La respuesta oneliner:

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

(opcionalmente utilizar .split() con maxsplit=1 si los valores también pueden contener el carácter "=")

+0

Lo siento, pero este es un -1. Esto no obedece a varias cosas que son válidas por la gramática que es válida para un archivo de propiedades.Consulte el siguiente enlace para obtener más detalles sobre lo que falta en esta respuesta: https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0204propertiesfileformat01.html. Los archivos de propiedades, similares a JSON, no tienen una gramática muy compleja, pero debes obedecerla sin excepción. – searchengine27

2

esto puede ser una respuesta estúpida, pero quién sabe si puede ayudarte :)

cambiar la extensión del archivo a .py, y hacer los cambios necesarios como esto:

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 ? 

y lo puso en su árbol de paquetes o en sys.path, y ahora puede llamar así en el guión cuando desee utilizarlo:

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

por qué estoy escribiendo esta respuesta es porque, ¿qué diablos es este archivo? Nunca veo un archivo conf como este, no hay sección, no hay nada? ¿Por qué quieres crear un archivo de configuración como este? parece un archivo de configuración incorrecto que debería parecerse a la configuración de Django, y prefiero usar un archivo de configuración de configuración django siempre que pueda.

Ahora usted puede poner su -1 en la izquierda :)

+0

Es un archivo de propiedades de Java. Bastante estándar, lo que hace una pena que ConfigParser arroje un NoSectionError si no hay secciones. Debería enviar una solicitud de función para eso. – samwyse

+0

Me gusta que estés pensando fuera de la caja, pero esto se romperá en una línea como 'VarName: value', que se rompe en el caracter': ', y el hecho de que tu' value' no tiene comillas alrededor eso. – searchengine27

+0

Además, los archivos @samwyse: .cfg, aunque no tienen una gramática formal tan centralizada como un archivo .properties, se suelen interpretar de manera diferente que .properties. 'ConfigParser' es una biblioteca para comprender los archivos .cfg, por lo que si escribes un error en esa biblioteca por no leer .properties, es probable que lo rechacen y lo rechacen. Lo haría de todos modos. Los archivos .properties no son responsabilidad de un analizador .cfg. Los archivos .cfg requieren la existencia de una sección en la mayoría de los controladores .cfg, por lo que se lanza esa excepción. – searchengine27

8

Tomando @ respuesta de Steven no tiene en cuenta los comentarios y saltos de línea en las propiedades del archivo, éste lo hace:

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

Lo siento, pero esto tiene el mismo problema que @Steven. Si esto obedecía a la gramática, eliminaría el voto a favor, o si la respuesta al menos reconocía que esto no está analizando un archivo de propiedades. – searchengine27

0

Si necesita para leer todos los valores de una sección en el archivo de propiedades de manera simple:

Su configuración.archivo de propiedades de diseño:

[SECTION_NAME]

clave1 = valor1

clave2 = valor2

Usted código:

import configparser 

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

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

esto le dará un diccionario donde las claves son los mismos que en archivo de configuración y sus valores correspondientes.

details_dict es:

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

Para python2 hay un jproperties https://pypi.python.org/pypi/jproperties/1.0.1

Para python2/3 hay javaproperties http://javaproperties.readthedocs.io/en/v0.1.0/

tan simple como:

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

Honestamente, esta es la única solución completa que resuelve el 100 por ciento del problema del OP. El único problema podría ser el uso de bibliotecas de terceros que podrían estar restringidas por su organización, como sucede con frecuencia en el mundo corporativo. Una solución que tengo para el mismo problema requiere el uso de una biblioteca separada, así que no tengo una mejor solución para esto, necesariamente, simplemente diferente. – searchengine27

0

OK nadie más en las respuestas lo ha mencionado, así que supongo que voy a hacerlo. Si está escribiendo Python y tiene control sobre su intérprete, quizás pueda forzar el uso del intérprete Jython.

Jython es un intérprete de Python implementado completamente en Java. Tiene todas las bibliotecas estándar de Python a su alcance, con la ventaja adicional de todas sus bibliotecas Java SE disponibles.

No he ejecutado ninguno de los siguientes (piénselo más como psudeo-code sin manejo de excepciones), pero puede mezclar y combinar bibliotecas de Python y Java, y su código podría terminar pareciéndose a:

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') 

que un archivo como esto será válido, que no lo haría en las simples soluciones split on '=':

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

La desventaja, es que se pierde su capacidad para ser portátiles entre variando intérpretes de Python y ahora estás encerrado en Jython . Sería bloqueado en una biblioteca si intentas ese enfoque también. El motivo por el que me gusta Jython es su flexibilidad adicional al tener todas las bibliotecas Java SE disponibles.

Cuestiones relacionadas