15

我有以下内容:

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

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

就我而言,随着新的部分/数据被添加到config.cfg文件中,我更新了我的 wxtree 小部件。但是,它只更新一次,我怀疑这是因为config.read文件处于打开状态。

ConfigParser当我们这样做时,和之间的主要区别是RawConfigParser什么?

4

4 回答 4

33

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() 的框中:)

于 2013-05-21T09:20:18.513 回答
15

使用readfp而不是读取:

with open('connections.cfg') as fp:
    config = ConfigParser()
    config.readfp(fp)
    sections = config.sections()
于 2009-06-13T16:03:27.947 回答
5

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

x = 9000 %(y)s
y = spoons

在这种情况下,x将是9000 spoons,并且y将只是spoons。如果您需要此扩展功能,文档建议您改用SafeConfigParser. 我不知道这两者之间的区别是什么。如果你不需要扩展(你可能不需要)只需要RawConfigParser.

于 2009-06-13T16:21:01.443 回答
4

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

config = ConfigParser()
#...on each change
fp = open('connections.cfg')
config.readfp(fp)
fp.close()
sections = config.sections()
于 2009-06-13T16:01:03.223 回答