Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python将ini文件中的所有内容读入字典_Python_Configuration Files_Ini - Fatal编程技术网

用Python将ini文件中的所有内容读入字典

用Python将ini文件中的所有内容读入字典,python,configuration-files,ini,Python,Configuration Files,Ini,通常,我编写如下代码以获取变量中的特定项,如下所示 try: config = ConfigParser.ConfigParser() config.read(self.iniPathName) except ConfigParser.MissingSectionHeaderError, e: raise WrongIniFormatError(`e`) try: self.makeDB = config.get("DB","makeDB") except Co

通常,我编写如下代码以获取变量中的特定项,如下所示

try:
    config = ConfigParser.ConfigParser()
    config.read(self.iniPathName)
except ConfigParser.MissingSectionHeaderError, e:
    raise WrongIniFormatError(`e`)

try:
    self.makeDB = config.get("DB","makeDB")
except ConfigParser.NoOptionError:
    self.makeDB = 0
有没有办法阅读python字典中的所有内容

比如说

[A] x=1 y=2 z=3 [B] x=1 y=2 z=3 [A] x=1 y=2 z=3 [乙] x=1 y=2 z=3 写入

val["A"]["x"] = 1 ... val["B"]["z"] = 3 val[“A”][“x”]=1 ... val[“B”][“z”]=3
我设法得到了一个答案,但我希望会有更好的答案

dictionary = {}
for section in config.sections():
    dictionary[section] = {}
    for option in config.options(section):
        dictionary[section][option] = config.get(section, option)

ConfigParser的实例数据作为嵌套dict存储在内部。您可以复制它,而不是重新创建它

>>> import ConfigParser
>>> p = ConfigParser.ConfigParser()
>>> p.read("sample_config.ini")
['sample_config.ini']
>>> p.__dict__
{'_defaults': {}, '_sections': {'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B':         {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}, '_dict': <type 'dict'>}
>>> d = p.__dict__['_sections'].copy()
>>> d
{'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B': {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}
导入ConfigParser >>>p=ConfigParser.ConfigParser() >>>p.read(“sample_config.ini”) ['sample_config.ini'] >>>白话__ {u默认值:{},{u节:{'A':{'y':'2','uu名称:'A','z':'3','x':'1','B':{'y':'2','uu名称:'B','z':'3','x':'1'},' >>>d=p.uuu dict_uuuu[“u节”]。复制() >>>d {'A':{'y':'2','z':'3','x':'1'},'B':{'y':'2','B','z':'3','x':'1'} 编辑:


Alex Martelli's更干净、更健壮、更漂亮。虽然这是公认的答案,但我建议改用他的方法。有关更多信息,请参阅他对此解决方案的评论。

我建议将
ConfigParser.ConfigParser
(或
SafeConfigParser
,&c)子类化,以安全访问“受保护”属性(以单下划线开头的名称--“private”将是以两个下划线开头的名称,即使在子类中也不能访问):

这模拟了配置解析器的常规逻辑,并保证在所有版本的Python中都能工作,其中有
ConfigParser.py
模块(最高达2.7,这是
2.*
系列的最后一个版本,知道将来不会有Python 2。任何版本都可以保证兼容性;-)


如果您需要支持未来的Python
3.*
版本(高达3.1版,可能即将推出的3.2版也可以,只需将模块重命名为所有小写的
configparser
),几年后可能需要一些注意/调整,但我不希望有什么大问题。

如何在py中解析ini文件

import ConfigParser
config = ConfigParser.ConfigParser()
config.read('/var/tmp/test.ini')
print config.get('DEFAULT', 'network')
其中test.ini文件包含:

[DEFAULT]
network=shutup
others=talk

我知道这个问题是5年前提出的,但今天我提出了一个dict理解问题:

parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}

需要注意的另一件事是,
ConfigParser
将键值转换为小写,因此,如果要将配置条目转换为字典,请交叉检查您的需求。因此我面临一个问题。对我来说,我有驼峰大小写键,因此,当我开始使用字典而不是文件时,我不得不更改一些代码
ConfigParser.get()
方法在内部将键转换为小写

来自

假设文件:config.properties包含以下内容:

  • k=v
  • k2=v2
  • k3=v3
python代码:


我认为这是一个非常好的解决方案,为什么您对它不满意?这应该是答案,因为它解决了问题,而不必使用“private”“\u sections”属性。当然,如果需要使用OrderedDict,只需使用它来代替常规dict。用
defaultdict(dict)
替换
dictionary
将删除中间dict创建。我总是不愿意访问属性的受保护(“以下划线开头”)名称(而通过
\uuuu dict\uuuuuu
的荒谬的复杂性根本没有帮助--
d=p.。\u sections.copy()
完全等效、更简单、更直接)这就是为什么我在回答中建议使用子类来代替的——子类被期望访问基类的受保护属性。在C++中,这是强制的;在Python中,它不是,但是这是因为用户应该被纪律化到足以不需要强制执行;-),来自Python 3的ConfigParser具有这个功能,您可以在Python2中使用
parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}
def ConfigSectionMap(section):
dict1 = {}
options = Config.options(section)
for option in options:
    try:
        dict1[option] = Config.get(section, option)
        if dict1[option] == -1:
            DebugPrint("skip: %s" % option)
    except:
        print("exception on %s!" % option)
        dict1[option] = None
return dict1
def read_config_file(file_path):
        with open(file=file_path, mode='r') as fs:
            return {k.strip(): v.strip() for i in [l for l in fs.readlines() if l.strip() != ''] for k, v in [i.split('=')]}


print('file as dic: ', read_config_file('config.properties'))