Закрытие файла, открытого ConfigParser - PullRequest
10 голосов
/ 13 июня 2009

У меня есть следующее:

config = ConfigParser()
config.read('connections.cfg')
sections = config.sections()

Как закрыть файл, открытый с помощью config.read?

В моем случае, когда новые разделы / данные добавляются в файл config.cfg, я обновляю свой виджет wxtree. Тем не менее, он обновляется только один раз, и я подозреваю, что это потому, что config.read оставляет файл открытым.

И в то время как мы находимся в этом, в чем главное различие между ConfigParser и RawConfigParser?

Ответы [ 4 ]

20 голосов
/ 21 мая 2013

ConfigParser.read(filenames) на самом деле позаботится об этом за вас.

Во время кодирования я столкнулся с этой проблемой и обнаружил, что задаю себе тот же вопрос:

Чтение в основном означает, что я также должен закрыть этот ресурс после того, как я закончу с ним, верно?

Я прочитал ответ, который вы получили, предлагая открыть файл самостоятельно и использовать config.readfp(fp) в качестве альтернативы. Я посмотрел на документацию и увидел, что действительно нет ConfigParser.close(). Итак, я исследовал немного больше и прочитал саму реализацию кода ConfigParser:

def read(self, filenames):
    """Read and parse a filename or a list of filenames.

    Files that cannot be opened are silently ignored; this is
    designed so that you can specify a list of potential
    configuration file locations (e.g. current directory, user's
    home directory, systemwide directory), and all existing
    configuration files in the list will be read.  A single
    filename may also be given.

    Return list of successfully read files.
    """
    if isinstance(filenames, basestring):
        filenames = [filenames]
    read_ok = []
    for filename in filenames:
        try:
            fp = open(filename)
        except IOError:
            continue
        self._read(fp, filename)
        fp.close()
        read_ok.append(filename)
    return read_ok

Это фактический read() метод из исходного кода ConfigParser.py. Как видите, третья строка снизу, fp.close() закрывает открытый ресурс после его использования в любом случае. Это предлагается вам, уже включена в коробку с ConfigParser.read ():)

10 голосов
/ 13 июня 2009

Используйте readfp вместо чтения:

with open('connections.cfg') as fp:
    config = ConfigParser()
    config.readfp(fp)
    sections = config.sections()
5 голосов
/ 13 июня 2009

Разница между ConfigParser и RawConfigParser заключается в том, что ConfigParser попытается "волшебным образом" расширить ссылки на другие переменные конфигурации, например, так:

x = 9000 %(y)s
y = spoons

В этом случае x будет 9000 spoons, а y будет spoons. Если вам нужна эта функция расширения, в документации рекомендуется использовать SafeConfigParser. Я не знаю, в чем разница между ними. Если вам не нужно расширение (вы, вероятно, не), просто нужно RawConfigParser.

4 голосов
/ 13 июня 2009

Чтобы проверить свои подозрения, используйте ConfigParser.readfp () и самостоятельно обрабатывайте открытие и закрытие файла. Сделайте вызов readfp после внесения изменений.

config = ConfigParser()
#...on each change
fp = open('connections.cfg')
config.readfp(fp)
fp.close()
sections = config.sections()
...