gpt4 book ai didi

python RawConfigParser

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:39 25 4
gpt4 key购买 nike

我正在使用 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 文件内容的代码。这是重现问题的一小段代码

import ConfigParser

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

def __init__(self, str_statusfile):
self.myConfig.read( str_statusfile)
self.statusfile = str_statusfile

def option(self, new_value):
self.myConfig.set("section","option",new_value)
with open( self.statusfile, "w") as ini_out:
self.myConfig.write( ini_out )


statusfiles = ['inifile_1.ini', 'inifile_2.ini']
for myStatus in statusfiles:
myConfig = status_file(myStatus)
myConfig.option("Something new")

执行此代码后,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:

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

def __init__(self, str_statusfile):
...

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

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

class status_file(object):

def __init__(self, str_statusfile):
self.myConfig = ConfigParser.RawConfigParser()
self.myConfig.optionxform = str
...

作为旁注,如果您使用的是 Python 2.x 版,您的类应该继承自 object。否则,您将拥有旧式(python2.2 之前的)类,这些类可能会给您带来许多微妙的问题。

关于python RawConfigParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28218269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com