2009-06-13 11 views
10

Ho il seguente:file di chiusura aperto da ConfigParser

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

Come posso chiudere il file aperto con config.read?

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

E mentre ci siamo, qual è la differenza principale tra ConfigParser e RawConfigParser?

+1

Avanti, la documentazione è tua amica: http://docs.python.org/library/configparser.html – Armandas

+5

L'ho letto . Impossibile trovare come chiuderlo. E per quanto riguarda ConfigParser vs RawConfigParser, l'unica differenza che vedo sono alcuni metodi. – sqram

risposta

9

Uso readfp invece di lettura:

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

Per verificare i propri sospetti, utilizzare ConfigParser.readfp() e gestire l'apertura e la chiusura del file da soli. Effettuare la chiamata readfp dopo aver apportato le modifiche.

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

Questo non funziona. 'readfp' accetta un oggetto file come argomento, ma il tuo' read' accetta solo una stringa con percorso file. Forse hai dimenticato solo 2 caratteri nel codice. – bluish

+1

Grazie a @bluish, un errore di battitura rilevato dopo 18 mesi è la prova della pertinenza ...Il link e il testo erano OK, ora l'esempio di codice è stato risolto. – gimel

+1

D fantastico! ora ti meriti un upvote. Se elimini il tuo commento, eliminerò il mio, quindi la risposta sarà più pulita da leggere;) – bluish

5

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 sarà 9000 spoons e sarà solo spoons. Se hai bisogno di questa funzione di espansione, i documenti consiglia di utilizzare invece SafeConfigParser. Non so quale sia esattamente la differenza tra i due. Se non hai bisogno dell'espansione (probabilmente non lo fai) hai solo bisogno di RawConfigParser.

+0

grazie per questo – sqram

17

ConfigParser.read(filenames) in realtà si prende cura di questo per voi.

Mentre la codifica ho incontrato questo problema e mi sono trovato 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 lo documentation e ho visto che in effetti non c'è lo ConfigParser.close(). Così ho studiato un po 'di più e leggere l'implementazione del codice ConfigParser stessa:

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 read() metodo effettivo dal codice sorgente ConfigParser.py. Come puoi vedere, la terza riga dal basso, fp.close() chiude la risorsa aperta dopo il suo utilizzo in ogni caso. Questo è offerto, già incluso nella confezione con ConfigParser.read() :)

+0

ben fatto. Grazie. – sqram