Editar archivo de configuración a través de python

Necesito editar un archivo de configuración a través de python y traté de buscar en stackoverflow y google y no cubren mi situación, ya que necesito reemplazar líneas en el archivo y realizar coincidencias en mi búsqueda.

Además, lo que encontré cubre cómo hacerlo en una línea, realizaré al menos 8 reemplazos de línea en el archivo y me gustaría saber si hay una forma más limpia y elegante de hacerlo que poner 10 reemplazar (foo , barra) líneas en total.

Necesito “emparejar” líneas como “ENABLEPRINTER”, “PRINTERLIST”, “PRNT1.PORT”. Quiero hacer coincidir este texto e ignorar lo que sigue (por ejemplo: “= PRNT1, PRNT2”).

Así que haría algo como

replace('ENABLEPRINTER', 'y') replace('PRINTERLIST', 'PRNT3) 

El archivo se ve así:

 ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

También tenga en cuenta que estos archivos tienen aproximadamente 100 líneas y necesito editar aproximadamente 10 de ellos.

Muchas gracias por su ayuda.

ACTUALIZACIÓN :

Usando el código publicado por @JF Sebastian, ahora obtengo el siguiente error:

 configobj.ParseError: Parse error in value at line 611. 

La línea 611 del archivo es:

 log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-d 

Entonces el problema es con el ‘personaje’.

Si comento esa línea, el script funciona bien con el código publicado por @JF Sebastian.

 import re pat = re.compile('ENABLEPRINTER|PRINTERLIST|PRNT1.PORT') def jojo(mat,dic = {'ENABLEPRINTER':'y', 'PRINTERLIST':'PRNT3', 'PRNT1.PORT':'734'} ): return dic[mat.group()] with open('configfile','rb+') as f: content = f.read() f.seek(0,0) f.write(pat.sub(jojo,content)) f.truncate() 

Antes de:

 ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

Después:

 y=n PRNT3==PRNT1, PRNT2 734=9600 PRNT1.BITS=8 

Demasiado simple para ser definitivo. Di cuáles son los errores o debilidades.

La ventaja de las expresiones regulares es que se pueden modular fácilmente a casos particulares.

.

EDITAR:

Acabo de ver eso:

“Lo que quiero hacer es asignar un nuevo valor a la variable”

Usted podría informar de eso antes!

¿Podría dar un ejemplo de archivo antes / después, por favor.

.

Editar 2

Aquí está el código para cambiar los valores de ciertas variables en un archivo:

 import re from os import fsync def updating(filename,dico): RE = '(('+'|'.join(dico.keys())+')\s*=)[^\r\n]*?(\r?\n|\r)' pat = re.compile(RE) def jojo(mat,dic = dico ): return dic[mat.group(2)].join(mat.group(1,3)) with open(filename,'rb') as f: content = f.read() with open(filename,'wb') as f: f.write(pat.sub(jojo,content)) #----------------------------------------------------------- vars = ['ENABLEPRINTER','PRINTERLIST','PRNT1.PORT'] new_values = ['y','PRNT3','8310'] what_to_change = dict(zip(vars,new_values)) updating('configfile_1.txt',what_to_change) 

Antes de:

 ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

Después:

 ENABLEPRINTER=y PRINTERLIST=PRNT3 PRNT1.PORT=8310 PRNT1.BITS=8 

Si el archivo está en formato java.util.Properties , entonces podría usar pyjavaproperties :

 from pyjavaproperties import Properties p = Properties() p.load(open('input.properties')) for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: p[name] = value p.store(open('output.properties', 'w')) 

No es muy robusto, pero varias soluciones podrían beneficiar a las personas que vienen después.


Para reemplazar varias veces en una cadena corta:

 for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: some_string = some_string.replace(old, new) 

Para reemplazar nombres de variables en un archivo de configuración (usando el módulo configobj ):

 import configobj conf = configobj.ConfigObj('test.conf') for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: conf[new] = conf[old] del conf[old] conf.write() 

Si por replace('ENABLEPRINTER', 'y') quiere decir asignar y a la variable ENABLEPRINTER entonces:

 import configobj ENCODING='utf-8' conf = configobj.ConfigObj('test.conf', raise_errors=True, file_error=True, # don't create file if it doesn't exist encoding=ENCODING, # used to read/write file default_encoding=ENCODING) # str -> unicode internally (useful on Python2.x) conf.update(dict(ENABLEPRINTER='y', PRINTERLIST='PRNT3')) conf.write() 

Parece que configobj no es compatible con:

 name = '.'something 

Usted podría citarlo:

 name = "'.'something" 

O:

 name = '.something' 

O

 name = .something 

conf.update() hace algo similar a:

 for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: conf[name] = value