Chiusura di file aperto da ConfigParser
-
13-09-2019 - |
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
?
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()