Wie eine Konfigurationsdatei / Python-Datei IO speichern
-
07-07-2019 - |
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)
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:
- Thread / Prozess A liest die Datei
- Thread / Prozess B liest die Datei
- Thread / Prozess A aktualisiert die Datei
- 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>