我正在使用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)
生成的
您所造成的困惑是这样定义ConfigParser:
使
myConfig
属性成为status_file
的类属性,与Java不同。 因此,当您解析第二个文件时,同一个配置文件将解析它,并将其选项与它解析的第一个文件合并。在为了避免您的问题,只需在
^{pr2}$__init__
方法中创建解析器作为实例属性:另外,如果您使用的是pythonversion2.x,那么您的类应该继承自
object
。否则,您将使用旧样式(python2.2之前的)类,这些类可能会出现许多微妙的问题。在这是初学者常见的python错误。我想你知道像java或C++这样的语言,是吗?在
在您的类中,^{是类的属性,而不是实例。Python的默认行为是先查看实例属性,然后查看类属性,因此
self.myConfig
在两个实例中都是完全相同的解析器。有关扩展的详细信息,请参见this。在解决方案是在构造函数(
__init__
)中创建和配置解析器,而不是类声明。在这可以帮助您理解myConfig为什么是类属性,而不是实例属性: 当你写这样的东西时:
它只是语法糖:
^{pr2}$如果需要动态创建新类,这可能会很有用。 由于}方法,这将导致新实例的创建,该实例将与它的
A
是类,它的__call__
方法最终导致调用它的__new__
和{__class__
属性共享同一个对象A
(这是简化,这并不是内部发生的全部,但对于一般pythong来说,这就足够了;)。在相关问题 更多 >
编程相关推荐