Python3でINIファイルを読み書きする方法は?


117

Python3でINIファイルを読み取り、書き込み、作成する必要があります。

FILE.INI

default_path = "/path/name/"
default_file = "file.txt"

Pythonファイル:

#    Read file and and create if it not exists
config = iniFile( 'FILE.INI' )

#    Get "default_path"
config.default_path

#    Print (string)/path/name
print config.default_path

#    Create or Update
config.append( 'default_path', 'var/shared/' )
config.append( 'default_message', 'Hey! help me!!' )

更新された FILE.INI

default_path    = "var/shared/"
default_file    = "file.txt"
default_message = "Hey! help me!!"



適切なiniファイルには、のようなセクション見出しが必要[foobar]です。
Martin Thoma

回答:


147

これは、次のようなものから始めることができます。

import configparser

config = configparser.ConfigParser()
config.read('FILE.INI')
print(config['DEFAULT']['path'])     # -> "/path/name/"
config['DEFAULT']['path'] = '/var/shared/'    # update
config['DEFAULT']['default_message'] = 'Hey! help me!!'   # create

with open('FILE.INI', 'w') as configfile:    # save
    config.write(configfile)

詳細については、公式のconfigparserのドキュメントをご覧ください。


4
与えるconfigparser.MissingSectionHeaderError適切なセクションヘッダなしで提供されるサンプルファイルを使用している場合。
Jaakko、

81

以下に、完全な読み取り、更新、書き込みの例を示します。

入力ファイル、test.ini

[section_a]
string_val = hello
bool_val = false
int_val = 11
pi_val = 3.14

作業コード。

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import ConfigParser  # ver. < 3.0

# instantiate
config = ConfigParser()

# parse existing file
config.read('test.ini')

# read values from a section
string_val = config.get('section_a', 'string_val')
bool_val = config.getboolean('section_a', 'bool_val')
int_val = config.getint('section_a', 'int_val')
float_val = config.getfloat('section_a', 'pi_val')

# update existing value
config.set('section_a', 'string_val', 'world')

# add a new section and some values
config.add_section('section_b')
config.set('section_b', 'meal_val', 'spam')
config.set('section_b', 'not_found_val', '404')

# save to a file
with open('test_update.ini', 'w') as configfile:
    config.write(configfile)

出力ファイル、test_update.ini

[section_a]
string_val = world
bool_val = false
int_val = 11
pi_val = 3.14

[section_b]
meal_val = spam
not_found_val = 404

元の入力ファイルは変更されません。


私のPython 3.7システムでは、「config.set( 'section_b'、 'not_found_val'、404)」という行を「config.set( 'section_b'、 'not_found_val'、str(404))」に変更する必要がありました。 「セット」のパラメータは文字列でなければなりません。素晴らしい例、ありがとう!
Ed氏、

read メソッドが読み取ったファイル/ファイルのリストを返すが、コンテンツは返さないように見える
YTerle


5

標準ConfigParserは通常を介したアクセスを必要としますがconfig['section_name']['key']、これは面白くありません。少し変更すると、属性アクセスを提供できます。

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

AttrDict派生クラスでdictあり、辞書キーと属性アクセスの両方を介してアクセスできます。つまり、a.x is a['x']

このクラスはConfigParser次の場所で使用できます。

config = configparser.ConfigParser(dict_type=AttrDict)
config.read('application.ini')

そして今、私たちは次のようにapplication.iniなります:

[general]
key = value

なので

>>> config._sections.general.key
'value'

6
素敵なトリックですが、この方法のユーザーは注意してください。このようにアクセスするconfig._sections.general.key = "3"と、configオプションの内部値が変更されないため、読み取り専用アクセスにのみ使用できます。.read()コマンドの後に構成が拡張または変更された場合(オプション、一部のセクションの値のペアを追加、->これは非常に重要な補間を行う)、このアクセス方法は使用しないでください。また、config._sections["section"]["opt"]非公開であるへのアクセスは、補間を回避し、生の値を返します。
ガブリエル

5

ConfigObjは、ConfigParserに代わる優れた選択肢であり、柔軟性が大幅に向上しています。

  • ネストされたセクション(サブセクション)、任意のレベル
  • リスト値
  • 複数の線の値
  • 文字列補間(置換)
  • 自動型チェック/変換繰り返しセクションを含む強力な検証システムと統合され、デフォルト値を許可します
  • 構成ファイルを書き出すとき、ConfigObjはすべてのコメントとメンバーおよびセクションの順序を保持します
  • 構成ファイルを操作するための多くの便利なメソッドとオプション( 'reload'メソッドなど)
  • 完全なUnicodeサポート

それはいくつかの欠点があります:

  • 区切り文字を設定することはできません、それは=…(プルリクエスト)でなければなりません
  • :あなたは空の値を持つことができない、よくあなたは彼らが言って見ることができるfuabr =だけではなく、fubar奇妙な、間違ったに見えました。

1
Sardathrionは正解です。元のファイルと同じようにファイル内のコメントとセクションの順序を保持する場合は、ConfigObjが適しています。ConfigParserはコメントをクリアするだけでなく、ある時点で順序を乱します。
アライズ

1

backup_settings.iniファイルの内容

[Settings]
year = 2020

読むためのpythonコード

import configparser
config = configparser.ConfigParser()
config.read('backup_settings.ini') #path of your .ini file
year = config.get("Settings","year") 
print(year)

書き込みまたは更新用

from pathlib import Path
import configparser
myfile = Path('backup_settings.ini')  #Path of your .ini file
config.read(myfile)
config.set('Settings', 'year','2050') #Updating existing entry 
config.set('Settings', 'day','sunday') #Writing new entry
config.write(myfile.open("w"))

出力

[Settings]
year = 2050
day = sunday
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.