2011-07-08 15 views
22

¿Cómo se pueden escribir comentarios en un archivo determinado dentro de las secciones?Escribir comentarios en archivos con ConfigParser

Si tengo:

import ConfigParser 
with open('./config.ini', 'w') as f: 
    conf = ConfigParser.ConfigParser() 
    conf.set('DEFAULT', 'test', 1) 
    conf.write(f) 

voy a obtener el archivo:

[DEFAULT] 
test = 1 

Pero, ¿cómo puedo obtener un archivo con comentarios dentro [DEFAULT] sección, como:

[DEFAULT] 
; test comment 
test = 1 

Sé que puedo escribir códigos en archivos haciendo:

import ConfigParser 
with open('./config.ini', 'w') as f: 
    conf = ConfigParser.ConfigParser() 
    conf.set('DEFAULT', 'test', 1) 
    conf.write(f) 
    f.write('; test comment') # but this gets printed after the section key-value pairs 

¿Es esta una posibilidad con ConfigParser? Y no quiero probar otro módulo porque necesito mantener mi programa como "stock" como sea posible.

+0

Después de considerar ConfigParser para escribir archivos de configuración, he decidido escribir mi archivo usando archivos estándar de edad interfaz 'f = open ('test.ini', 'w'); f.write ('blabla') 'porque el módulo ConfigParser ni siquiera escribe en un orden predefinido (porque está utilizando diccionarios, aunque uno de los ejemplos indica que la escritura se realiza en algún tipo de orden: [documentos de python]) (http://docs.python.org/library/configparser.html#examples)) – razvanc

+0

Si todavía está cerca, le sugiero que escriba una breve respuesta al respecto y la marque como aceptada. Leí la respuesta propuesta incluso después de este comentario y llegué a la misma conclusión ... pero me tomó un tiempo e incluso he votado la solución seleccionada ... – estani

Respuesta

19

Puede utilizar el allow_no_value opción si tienes V ersion> = 2,7

Este fragmento:

import ConfigParser 

config = ConfigParser.ConfigParser(allow_no_value=True) 
config.add_section('default_settings') 
config.set('default_settings', '; comment here') 
config.set('default_settings', 'test', 1) 
with open('config.ini', 'w') as fp: 
    config.write(fp) 


config = ConfigParser.ConfigParser(allow_no_value=True) 
config.read('config.ini') 
print config.items('default_settings') 

creará un archivo ini así:

+0

Como nota al margen, esto funciona siempre que no intente escribir comentarios en la sección 'DEFAULT' - hay una marca en la función de escritura para evitar escribir "= None", pero solo cuando no se escribe fuera de la sección 'DEFAULT' –

+0

Buen punto. Afortunadamente, en Python 3.6, el módulo 'configparser' no tiene este extraño comportamiento. Por lo tanto, 'config = configparser.ConfigParser ({"; comment": None}, allow_no_value = True) 'inserta un comentario en la sección predeterminada, sin ningún seguimiento' = None'. Para garantizar un orden correcto de la salida, se requiere un 'collections.OrderedDict' (en lugar de un' dict' como en mi ejemplo). – EOL

+0

Esta opción solo funcionará en el caso de que esté creando un nuevo archivo. Si está editando un archivo anterior con comentarios de una sección, todos borrarán: / – GEPD

3

Puede crear una variable que empiece por # o; Carácter:

conf.set('default_settings', '; comment here', '') 
conf.set('default_settings', 'test', 1) 

archivo de configuración creado es

[default_settings] 
    ; comment here = 
    test = 1 

función ConfigParser.read no va a analizar primer valor

config = ConfigParser.ConfigParser() 
config.read('config.ini') 
print config.items('default_settings') 

da

[('test','1')] 
+1

Bastante fea con el final '='. – ThiefMaster

+0

Probablemente esta sea la mejor y única forma con ConfigParser. Gracias – razvanc

+0

Puede deshacerse de los últimos '='. Cuando quiera escribir un comentario, simplemente omita el tercer argumento cuando llame al método 'set'. De lo contrario, le está asignando una cadena vacía que da como resultado el seguimiento no deseado '='. – benregn

Cuestiones relacionadas