Frage

Ich habe diesen Python-Code für eine CFG-Datei zu öffnen, um es zu schreiben und speichert es:

import ConfigParser 

    def get_lock_file():
        cf = ConfigParser.ConfigParser()
        cf.read("svn.lock")
        return cf
    def save_lock_file(configurationParser):
        cf = configurationParser
        config_file = open('svn.lock', 'w')
        cf.write(config_file)
        config_file.close()

Scheint das normal oder ich bin etwas fehlt, wie Dateien zu öffnen-Schreib sparen? Gibt es eine Standardmethode Konfigurationsdateien lesen und schreiben?

Ich frage, weil ich zwei Methoden, die die gleiche Sache zu tun scheinen, bekommen sie die Konfigurationsdatei Griff ( ‚cf‘) call cf.set ( ‚bla‘, ‚foo‘ bar) verwenden Sie dann den save_lock_file (cf) nennen oben. Für eine Methode funktioniert es und für die andere Methode nimmt die Schreib nie statt, unsicher, warum an dieser Stelle.

def used_like_this():
        cf = get_lock_file()
        cf.set('some_prop_section', 'some_prop', 'some_value')
        save_lock_file(cf)
War es hilfreich?

Lösung

Just zu beachten, dass Konfigurationsdatei Handhabung ist einfacher mit ConfigObj.

lesen und dann eine Konfigurationsdatei schreiben:

from configobj import ConfigObj
config = ConfigObj(filename)

value = config['entry']
config['entry'] = newvalue
config.write()

Andere Tipps

Sieht gut aus für mich.

Wenn beide Orte get_lock_file nennen, dann cf.set(...) und dann save_lock_file, und keine Ausnahmen angehoben werden, sollte diese Arbeit.

Wenn Sie unterschiedliche Threads oder Prozesse die gleiche Datei zugreifen könnten Sie eine Race-Bedingung haben:

  1. Thread / Prozess A liest die Datei
  2. Thread / Prozess B liest die Datei
  3. Thread / Prozess A aktualisiert die Datei
  4. Thread / Prozess B aktualisiert die Datei

Jetzt ist nur die Datei enthält B-Updates, nicht A ist.

Auch für die sichere Datei schreiben, vergessen Sie nicht die with Aussage (Python 2.5 und höher), wird es Ihnen einen try / finally speichern (die Sie verwenden sollten, wenn Sie nicht with verwenden). Von ConfigParser der docs:

with open('example.cfg', 'wb') as configfile:
  config.write(configfile)

Funktioniert für mich.

C:\temp>type svn.lock
[some_prop_section]
Hello=World

C:\temp>python
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ConfigParser
>>> def get_lock_file():
...         cf = ConfigParser.ConfigParser()
...         cf.read("svn.lock")
...         return cf
...
>>> def save_lock_file(configurationParser):
...         cf = configurationParser
...         config_file = open('svn.lock', 'w')
...         cf.write(config_file)
...         config_file.close()
...
>>> def used_like_this():
...         cf = get_lock_file()
...         cf.set('some_prop_section', 'some_prop', 'some_value')
...         save_lock_file(cf)
...
>>> used_like_this()
>>> ^Z


C:\temp>type svn.lock
[some_prop_section]
hello = World
some_prop = some_value


C:\temp>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top