web-dev-qa-db-ja.com

Pythonを使用して、iniファイルのすべての内容を辞書に読み込みます

通常、私は次のように変数の特定の項目を取得するために次のようにコーディングします

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 
21
prosseek

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

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.*シリーズの最後です-知っていること将来はなくなりますPython 2.どのバージョンでも互換性をどのように実現できるか保証 ;-)。

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

33
Alex Martelli

なんとか答えが出ましたが、もっと良い答えがあるはずです。

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

私はこの質問が5年前に尋ねられたことを知っていますが、今日私はこの口述を理解しやすくしました:

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

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

11
Andrew

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
2
user285594

ファイル: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'))
0
Mohamed.Abdo

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

0
avitash