2009-06-13 21 views
10

Tengo el siguiente:al cerrar el archivo abierto por ConfigParser

config = ConfigParser() 
config.read('connections.cfg') 
sections = config.sections() 

¿Cómo puedo cerrar el archivo se abrió con config.read?

En mi caso, como nuevas secciones/datos se agregan al archivo config.cfg, actualizo mi widget wxtree. Sin embargo, solo se actualiza una vez, y sospecho que es porque config.read deja el archivo abierto.

Y mientras estamos en esto, ¿cuál es la principal diferencia entre ConfigParser y RawConfigParser?

+1

Vamos, la documentación es su amigo: http://docs.python.org/library/configparser.html – Armandas

+5

Lo leí . No se pudo encontrar cómo cerrarlo. Y en cuanto a ConfigParser frente a RawConfigParser, la única diferencia que veo son algunos métodos. – sqram

Respuesta

9

Uso readfp en lugar de lectura:

with open('connections.cfg') as fp: 
    config = ConfigParser() 
    config.readfp(fp) 
    sections = config.sections() 
4

Para poner a prueba su sospecha, utilice ConfigParser.readfp() y maneje la apertura y el cierre del archivo usted mismo. Realice la llamada readfp después de realizar los cambios.

config = ConfigParser() 
#...on each change 
fp = open('connections.cfg') 
config.readfp(fp) 
fp.close() 
sections = config.sections() 
+1

Esto no funciona. 'readfp' acepta un objeto de archivo como argumento, pero su' lectura' acepta solo una cadena con ruta de archivo. Tal vez solo olvidaste 2 caracteres en el código. – bluish

+1

Gracias @bluish, un error tipográfico atrapado después de 18 meses es prueba de relevancia ...El enlace y el texto estaban bien, ahora el ejemplo del código está arreglado. – gimel

+1

D genial! ahora te mereces un voto positivo. Si eliminas tu comentario, eliminaré el mío para que la respuesta sea más clara;) – bluish

5

La diferencia entre ConfigParser y RawConfigParser es que ConfigParser intentará "mágicamente" ampliar las referencias a otras variables de configuración, así:

x = 9000 %(y)s 
y = spoons 

En este caso, x será 9000 spoons, y y solo será spoons. Si necesita esta característica de expansión, los documentos recomiendan que en su lugar use SafeConfigParser. No sé cuál es la diferencia entre los dos. Si no necesita la expansión (probablemente no) solo necesita RawConfigParser.

+0

gracias por este – sqram

17

ConfigParser.read(filenames) realmente se ocupa de eso para usted.

mientras que la codificación he encontrado con este tema y me encontré preguntándome la misma pregunta:

lectura básicamente significa también tengo que cerrar este recurso después de que he terminado con ella, ¿verdad?

leí la respuesta que llegamos aquí lo que sugiere para abrir el archivo usted mismo y utilizar config.readfp(fp) como una alternativa. Miré el documentation y vi que de hecho no hay ConfigParser.close(). Así que investigué un poco más y leí la propia implementación del código ConfigParser:

def read(self, filenames): 
    """Read and parse a filename or a list of filenames. 

    Files that cannot be opened are silently ignored; this is 
    designed so that you can specify a list of potential 
    configuration file locations (e.g. current directory, user's 
    home directory, systemwide directory), and all existing 
    configuration files in the list will be read. A single 
    filename may also be given. 

    Return list of successfully read files. 
    """ 
    if isinstance(filenames, basestring): 
     filenames = [filenames] 
    read_ok = [] 
    for filename in filenames: 
     try: 
      fp = open(filename) 
     except IOError: 
      continue 
     self._read(fp, filename) 
     fp.close() 
     read_ok.append(filename) 
    return read_ok 

Ésta es la read() método real a partir del código fuente ConfigParser.py. Como puede ver, la 3ra línea desde la parte inferior, fp.close() cierra el recurso abierto después de su uso en cualquier caso. Esto se le ofrece a usted, ya incluido en el cuadro con ConfigParser.read() :)

+0

The camino a seguir. Gracias. – sqram

Cuestiones relacionadas