关闭ConfigParser打开的文件

时间:2009-06-13 15:28:15

标签: python configparser

我有以下内容:

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

如何关闭使用config.read打开的文件?

在我的情况下,随着新的部分/数据被添加到config.cfg文件,我更新了我的wxtree小部件。但是,它只更新一次,我怀疑是因为config.read使文件保持打开状态。

虽然我们在做什么,ConfigParserRawConfigParser之间的主要区别是什么?

4 个答案:

答案 0 :(得分:19)

ConfigParser.read(filenames)实际上会照顾你。

编码时我遇到了这个问题,发现自己也在问自己同样的问题:

  

阅读基本上意味着我必须在完成后关闭此资源,对吗?

我读到了你在这里建议自己打开文件并使用config.readfp(fp)作为替代方案的答案。我看了documentation,发现确实没有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

这是ConfigParser.py源代码中的实际read()方法。如您所见,从底部开始的第3行,fp.close()在任何情况下使用后都会关闭打开的资源。这是提供给您的,已包含在ConfigParser.read()的框中:)

答案 1 :(得分:9)

使用readfp代替阅读:

with open('connections.cfg') as fp:
    config = ConfigParser()
    config.readfp(fp)
    sections = config.sections()

答案 2 :(得分:5)

ConfigParserRawConfigParser之间的区别在于ConfigParser会尝试“神奇地”扩展对其他配置变量的引用,如下所示:

x = 9000 %(y)s
y = spoons

在这种情况下,x将为9000 spoonsy将为spoons。如果您需要此扩展功能,则文档建议您改为使用SafeConfigParser。我不知道两者之间有什么区别。如果您不需要扩展(您可能不需要),只需要RawConfigParser

答案 3 :(得分:4)

要测试您的怀疑,请使用ConfigParser.readfp()并自行处理文件的打开和关闭。在进行更改后进行readfp调用。

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