python RawConfigPars

2024-04-19 13:39:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用RawConfigParser来读取和更新ini样式的配置文件。这在标准配置中完全没有问题。 我的问题是在同一个脚本中读取不同的配置文件。在不太详细的情况下,当我读取第二个配置文件时,它的值将与第一个ini文件合并。在

两个ini文件的原始内容

infile_1.ini
[section]
option = Original value
extraoption = not in ini file 2

inifile_2.ini
[section]
option = Original value

这是我用来改变ini文件内容的代码。这是一段很短的代码来重现这个问题

^{pr2}$

执行此代码后,ini文件的内容已按需要更改。但是在第二个ini文件中,来自第一个ini文件的选项被合并。在

infile_1.ini
[section]
option = Something New
extraoption = not in ini file 2

inifile_2.ini
[section]
option = Something New
extraoption = not in ini file 2

有什么方法可以重置ConfigParser内容或其他解决方案吗? 我想这与ConfigParser对象的构造和解构有关? 我没有上课就试过了,然后就没有问题了。 我是Python的初学者,所以这可能不是最好的处理方法。 实际的应用程序是动态的,在使用应用程序的过程中,ini文件的数量和位置都会发生变化。ini文件列表是用os.listdir(folder)生成的


Tags: 文件代码in内容value配置文件notsection
2条回答

您所造成的困惑是这样定义ConfigParser:

class status_file:
   myConfig = ConfigParser.RawConfigParser()
   myConfig.optionxform = str

   def __init__(self, str_statusfile):
       ...

使myConfig属性成为status_file属性,与Java不同。 因此,当您解析第二个文件时,同一个配置文件将解析它,并将其选项与它解析的第一个文件合并。在

为了避免您的问题,只需在__init__方法中创建解析器作为实例属性:

^{pr2}$

另外,如果您使用的是pythonversion2.x,那么您的类应该继承自object。否则,您将使用旧样式(python2.2之前的)类,这些类可能会出现许多微妙的问题。在

这是初学者常见的python错误。我想你知道像java或C++这样的语言,是吗?在

在您的类中,^{是类的属性,而不是实例。Python的默认行为是先查看实例属性,然后查看类属性,因此self.myConfig在两个实例中都是完全相同的解析器。有关扩展的详细信息,请参见this。在

解决方案是在构造函数(__init__)中创建和配置解析器,而不是类声明。在

这可以帮助您理解myConfig为什么是类属性,而不是实例属性: 当你写这样的东西时:

class A(B, C):
    def foo(x):
        return 2*x

它只是语法糖:

^{pr2}$

如果需要动态创建新类,这可能会很有用。 由于A是类,它的__call__方法最终导致调用它的__new__和{}方法,这将导致新实例的创建,该实例将与它的__class__属性共享同一个对象A(这是简化,这并不是内部发生的全部,但对于一般pythong来说,这就足够了;)。在

相关问题 更多 >