27

通常、変数内の特定のアイテムを取得するには、次のようにコーディングします。

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

に書き込まれます

val ["A"] ["x"] = 1
..。
val ["B"] ["z"] = 3
4

8 に答える 8

39

ConfigParser.ConfigParser「保護された」属性に安全にアクセスするには、サブクラス化(または、&c)をお勧めしSafeConfigParserます(単一のアンダースコアで始まる名前-「プライベート」は2つのアンダースコアで始まる名前であり、サブクラスでもアクセスできません...):

import ConfigParser

class MyParser(ConfigParser.ConfigParser):

    def as_dict(self):
        d = dict(self._sections)
        for k in d:
            d[k] = dict(self._defaults, **d[k])
            d[k].pop('__name__', None)
        return d

これは、構成パーサーの通常のロジックをエミュレートし、ConfigParser.pyモジュールがあるPythonのすべてのバージョンで動作することが保証されています(シリーズの最後である2.7まで2.*-将来のPython2がないことを知っています。互換性を保証する方法;-)。

将来のPythonバージョンをサポートする必要がある場合3.*(3.1まで、そしておそらく間もなく登場する3.2でも問題ないはずconfigparserです。もちろん、モジュールの名前をすべて小文字に変更するだけです)、数年後には注意/微調整が必​​要になる場合がありますが、大きなことは何も期待していません。

于 2010-07-10T21:26:01.177 に答える
32

私はなんとか答えを得ることができましたが、もっと良いものがあるはずだと思います。

dictionary = {}
for section in config.sections():
    dictionary[section] = {}
    for option in config.options(section):
        dictionary[section][option] = config.get(section, option)
于 2010-07-10T20:31:57.940 に答える
16

この質問が5年前に行われたことは知っていますが、今日、私はこのdictの理解を重要なものにしました。

parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}
于 2016-04-11T11:30:15.747 に答える
12

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'}}

編集:

Alex Martelliのソリューションは、よりクリーンで、より堅牢で、よりきれいです。これは受け入れられた答えでしたが、代わりに彼のアプローチを使用することをお勧めします。詳細については、このソリューションに対する彼のコメントを参照してください。

于 2010-07-10T21:24:32.257 に答える
2

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
于 2012-12-09T08:44:55.540 に答える
1

もう1つ注意ConfigParserしなければならないのは、キー値を小文字に変換することです。したがって、構成エントリを辞書に変換する場合は、要件をクロスチェックしてください。これが原因で問題に直面しました。私にとってはキャメルケースのキーを持っていたので、ファイルの代わりに辞書を使い始めたときにコードをいくらか変更する必要がありました。ConfigParser.get()メソッドは内部でキーを小文字に変換します。

于 2016-09-30T12:37:16.700 に答える
0

ファイル:config.propertiesに次のものが含まれているとします。

  • k = v
  • k2 = v2
  • k3 = v3

Pythonコード:

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'))
于 2019-05-19T04:56:27.550 に答える
-1

https://wiki.python.org/moin/ConfigParserExamplesから

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
于 2017-02-01T14:34:34.540 に答える