Как сохранить файл конфигурации / файл ввода-вывода Python

StackOverflow https://stackoverflow.com/questions/1423214

Вопрос

У меня есть этот код Python для открытия файла .cfg, записи в него и его сохранения:

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()

Кажется ли это нормальным, или я что-то упустил, как открыть-записать-сохранить файлы? Есть ли более стандартный способ чтения и записи файлов конфигурации?

Я спрашиваю, потому что у меня есть два метода, которые, кажется, делают одно и то же, они получают дескриптор файла конфигурации ('cf'), вызывают cf.set ('blah', 'foo' bar), затем используют файл save_lock_file (cf) звоните выше. Для одного метода это работает, а для другого метода запись никогда не происходит, не знаю, почему на этом этапе.

def used_like_this():
        cf = get_lock_file()
        cf.set('some_prop_section', 'some_prop', 'some_value')
        save_lock_file(cf)
Это было полезно?

Решение

Просто обратите внимание, что обработка файла конфигурации проще с ConfigObj.

Чтобы прочитать, а затем написать файл конфигурации:

from configobj import ConfigObj
config = ConfigObj(filename)

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

Другие советы

Выглядит хорошо для меня.

Если в обоих местах вызывается get_lock_file , затем cf.set (...) , а затем save_lock_file , и никаких исключений не возникает, это должно работать.

Если у вас разные потоки или процессы, обращающиеся к одному и тому же файлу, у вас может быть условие гонки:

<Ол>
  • поток / процесс A читает файл
  • поток / процесс B читает файл
  • поток / процесс A обновляет файл
  • поток / процесс B обновляет файл
  • Теперь файл содержит только обновления B, а не A.

    Кроме того, для безопасной записи файлов не забывайте инструкцию with (Python 2.5 и выше), это сэкономит вам попытку / наконец (что вы должны использовать, если вы не используется с ). Из документов ConfigParser :

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

    У меня работает.

    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>
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top