2009-06-13 8 views
10

Ich habe folgendes:Closing Datei geöffnet von ConfigParser

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

Wie kann ich schließen Sie die Datei mit config.read geöffnet?

In meinem Fall, als neue Abschnitte/Daten der config.cfg Datei hinzugefügt werden, aktualisiere ich meine WXtree Widget. Es wird jedoch nur einmal aktualisiert, und ich vermute, dass config.read die Datei geöffnet lässt.

Und während wir dabei sind, was ist der Hauptunterschied zwischen ConfigParser und RawConfigParser?

+1

Komm, Dokumentation ist dein Freund: http://docs.python.org/library/configparser.html – Armandas

+5

Ich habe es gelesen . Konnte nicht finden, wie man es schließt. Und wie für ConfigParser vs RawConfigParser, der einzige Unterschied, den ich sehe, ist einige Methoden. – sqram

Antwort

9

Verwendung readfp statt lesen:

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

Um Ihren Verdacht zu testen, verwenden Sie ConfigParser.readfp() und führen Sie das Öffnen und Schließen der Datei selbst durch. Rufen Sie readfp auf, nachdem die Änderungen vorgenommen wurden.

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

Dies funktioniert nicht. 'readfp' akzeptiert ein Dateiobjekt als Argument, aber Ihr' read' akzeptiert nur eine Zeichenkette mit Dateipfad. Vielleicht haben Sie nur 2 Zeichen im Code vergessen. – bluish

+1

Dank @bluish, ein Tippfehler nach 18 Monaten gefangen ist der Beweis der Relevanz ...Der Link und der Text waren in Ordnung, jetzt ist das Codebeispiel behoben. – gimel

+1

D groß! jetzt verschenkt ihr einen upvote. Wenn Sie Ihren Kommentar löschen, werde ich meinen löschen, damit die Antwort sauberer zu lesen ist;) – bluish

5

Der Unterschied zwischen ConfigParser und RawConfigParser ist, dass ConfigParser versuchen wird, auf "magische Weise" Verweise auf andere Konfigurationsvariablen zu erweitern, etwa so:

x = 9000 %(y)s 
y = spoons 

In diesem Fall wird x9000 spoons und y sein wird nur spoons sein. Wenn Sie diese Erweiterungsfunktion benötigen, empfiehlt die Dokumentation, stattdessen SafeConfigParser zu verwenden. Ich weiß nicht, was genau der Unterschied zwischen den beiden ist. Wenn Sie die Erweiterung nicht benötigen (wahrscheinlich nicht), brauchen Sie nur RawConfigParser.

+0

danke dafür – sqram

17

ConfigParser.read(filenames) eigentlich kümmert sich darum für Sie.

Während Codierung Ich habe dieses Problem gestoßen und fand mich selbst genau die gleiche Frage:

im Grunde bedeutet, Lesen Ich habe auch diese Ressource zu schließen, nachdem ich mit ihm fertig bin, nicht wahr?

Ich lese die Antwort, die Sie hier bekam was auf die Datei selbst zu öffnen und config.readfp(fp) als Alternative zu verwenden. Ich schaute auf die documentation und sah, dass es tatsächlich keine ConfigParser.close() gibt. Also habe ich recherchiert ein wenig mehr und lesen Sie die ConfigParser Code-Implementierung selbst:

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 

Dies ist die eigentliche read() Methode von ConfigParser.py Quellcode. Wie Sie sehen können, schließt die dritte Zeile von unten fp.close() die geöffnete Ressource nach ihrer Verwendung in jedem Fall. Dies wird Ihnen angeboten, bereits in der Box mit ConfigParser.read() enthalten :)

+0

Die Weg zu gehen. Vielen Dank. – sqram