Ответ 1
Используйте readfp вместо чтения:
with open('connections.cfg') as fp:
config = ConfigParser()
config.readfp(fp)
sections = config.sections()
У меня есть следующее:
config = ConfigParser()
config.read('connections.cfg')
sections = config.sections()
Как закрыть файл, открытый с помощью config.read
?
В моем случае, когда новые разделы/данные добавляются в файл config.cfg
, я обновляю свой виджет wxtree. Тем не менее, он обновляется только один раз, и я подозреваю это, потому что config.read
оставляет файл открытым.
И пока мы находимся в этом, в чем основное отличие между ConfigParser
и RawConfigParser
?
Используйте readfp вместо чтения:
with open('connections.cfg') as fp:
config = ConfigParser()
config.readfp(fp)
sections = config.sections()
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. Как вы можете видеть, 3-я строка снизу, fp.close()
закрывает открытый ресурс после его использования в любом случае. Это предлагается вам, уже включенному в поле с ConfigParser.read():)
Разница между ConfigParser
и RawConfigParser
заключается в том, что ConfigParser
будет пытаться "магически" расширять ссылки на другие конфигурационные переменные, например:
x = 9000 %(y)s
y = spoons
В этом случае x
будет 9000 spoons
, а y
будет только spoons
. Если вам нужна эта функция расширения, документы рекомендуют вместо этого использовать SafeConfigParser
. Я не знаю, какая разница между ними. Если вам не нужно расширение (вы, вероятно, нет), просто нужно RawConfigParser
.
Чтобы проверить ваше подозрение, используйте ConfigParser.readfp() и обрабатывайте открытие и закрытие файла самостоятельно. Выполните вызов readfp
после внесения изменений.
config = ConfigParser()
#...on each change
fp = open('connections.cfg')
config.readfp(fp)
fp.close()
sections = config.sections()