Domanda

Ho il seguente:

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

Come posso chiudere il file aperto con config.read?

Nel mio caso, come nuove sezioni / dati vengono aggiunti al file config.cfg, aggiorno il mio widget di wxtree. Tuttavia, si aggiorna solo una volta, e ho il sospetto che sia perché config.read lascia il file aperto.

E già che ci siamo, qual è la differenza principale tra ConfigParser e RawConfigParser?

È stato utile?

Soluzione

readfp invece di leggere:

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

Altri suggerimenti

ConfigParser.read(filenames) prende effettivamente cura di questo per voi.

Mentre la codifica ho incontrato questo problema e sono ritrovato a chiedermi la stessa domanda:

  

Lettura fondamentalmente significa che devo anche chiudere questa risorsa dopo ho finito con esso, giusto?

Ho letto la risposta che hai qui suggerendo di aprire il file da soli e utilizzare config.readfp(fp) come alternativa. Ho guardato il e ho visto che in effetti non c'è ConfigParser.close(). Così ho studiato un po 'di più e leggere l'implementazione del codice ConfigParser stesso:

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

Questo è il metodo read() reale dal codice sorgente ConfigParser.py. Come si può vedere, terza riga dal basso, fp.close() chiude la risorsa riaperto dopo il suo utilizzo, in ogni caso. Questo viene offerto all'utente, già incluso nella confezione ConfigParser.read ():)

La differenza tra ConfigParser e RawConfigParser è che ConfigParser tenterà di "magicamente" espandere riferimenti ad altre variabili di configurazione, in questo modo:

x = 9000 %(y)s
y = spoons

In questo caso, x saranno 9000 spoons, e y sarà solo spoons. Se avete bisogno di questa funzione di espansione, i documenti consiglia di utilizzare invece SafeConfigParser. Non so che cosa ricade perfettamente la differenza tra i due è. Se non è necessario l'espansione (probabilmente non) solo bisogno RawConfigParser.

Per verificare il sospetto, utilizzare ConfigParser.readfp () e la maniglia di apertura e chiusura del file da soli. Effettuare la chiamata readfp dopo le modifiche sono fatte.

config = ConfigParser()
#...on each change
fp = open('connections.cfg')
config.readfp(fp)
fp.close()
sections = config.sections()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top