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)
È stato utile?

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:

  1. thread / processo A legge il file
  2. thread / processo B legge il file
  3. thread / processo A aggiorna il file
  4. 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top