Come salvare un file di configurazione / file Python IO
-
07-07-2019 - |
Domanda
Ho questo codice Python per aprire un file .cfg, scriverlo e salvarlo:
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()
Sembra normale o mi sto perdendo qualcosa su come aprire-scrivere-salvare i file? Esiste un modo più standard per leggere e scrivere file di configurazione?
Lo chiedo perché ho due metodi che sembrano fare la stessa cosa, ottengono il file config handle ('cf') call cf.set ('blah', 'foo' bar) quindi usano il save_lock_file (cf) chiama sopra. Per un metodo funziona e per l'altro metodo la scrittura non ha mai luogo, non so perché a questo punto.
def used_like_this():
cf = get_lock_file()
cf.set('some_prop_section', 'some_prop', 'some_value')
save_lock_file(cf)
Soluzione
Solo per notare che la gestione dei file di configurazione è più semplice con ConfigObj.
Per leggere e quindi scrivere un file di configurazione:
from configobj import ConfigObj
config = ConfigObj(filename)
value = config['entry']
config['entry'] = newvalue
config.write()
Altri suggerimenti
Mi sembra bello.
Se entrambi i posti chiamano get_lock_file
, quindi cf.set (...)
, quindi save_lock_file
e non vengono sollevate eccezioni, questo dovrebbe funzionare.
Se hai thread o processi diversi che accedono allo stesso file potresti avere una condizione di competizione:
- thread / processo A legge il file
- thread / processo B legge il file
- thread / processo A aggiorna il file
- thread / processo B aggiorna il file
Ora il file contiene solo gli aggiornamenti di B, non quelli di A.
Inoltre, per una scrittura sicura dei file, non dimenticare l'istruzione with
(Python 2.5 e versioni successive), ti farà risparmiare un tentativo / infine (che dovresti usare se stai non usando con
). Dai documenti di ConfigParser
:
with open('example.cfg', 'wb') as configfile:
config.write(configfile)
Funziona per me.
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>