Python

PythonのConfigParserを使ったINIファイルの操作

2021年9月11日

PythonでConfigParserの使い方

PythonでINIファイルを操作してみます。

ここでいうINIファイルはWindowsのINIファイルではなく、あくまでの似た構造のINIファイルの操作になります。

PythonでINIファイルを操作するために、ConfigParserを使った方法をこの記事では解説しています。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

INIファイルとは

INIファイルは、初期のWindowsのソフトウェアで設定ファイルとして利用されていたファイル形式です。

しかし、Linux系でiniファイルを見かける場合があったのでWindows系の開発者のクセだったのかもしれません。

UnixやLinux系の設定ファイル系は、confとかです。

今では混在している状況なので、iniが付いている拡張子のファイルを見かけたら設定ファイルって認識で良いです。

INIファイルの書き方

INIファイルの書き方

INIファイルは、3つのフォーマットをもとに書いていきます。

基本的なフォーマットは下記になります。

基本フォーマット

  • セクション
  • パラメータ
  • コメント

INIファイルは、フォーマットの規格や標準化がされていないので、プログラム次第でいろいろな書き方ができます。

セクション

セクションは、[]でくくるセクションというグループを作る書き方を行います。

下記は例になります。

settingの部分に関しては、セクション名になります。

[setting]

セクションの宣言後に出てくるパラメータは、そのセクションに属します。

パラメータ

INIファイルで重要なのが、このパラメータと呼ばれる値の設定になります。

左辺が名称で、=(イコール)をつかって右辺に値を設定します。

下記が例になります。

language=ja

Pythonの変数名に値を入れる方法と同じです。

違うところは、型が無いので文字列はダブルクォーテーションやシングルクォーテーションなどで囲む必要はありません。

ただし、値でスペースや記号などを使いたい場合は、明示的に囲む必要あります。

date="2021-09-11"
description='このデータはスペース( )が入ります'

コメント

コメントを書くことができます。

Pythonだと先頭に#(ハッシュ記号)を使うことで、コメントアウトとして認識しますが、INIファイルだと先頭行に;(セミコロン)を利用します。

;この行はコメントアウトされています

ConfigParserとは

ConfigParserとは

ConfigParserは、マイクロソフトのWindowsで利用されているINIファイルと似た構造を実装することができます。

あくまで、似た構造なのでWindowsとは別モノとして認識した方が良いです。

インストール

Pythonに標準でついているのでインストールする必要はありません。

INIファイルの読み込み

INIファイルを読み込んでみます。

読み込むINIファイルは下記になります。

; 設定
[settings]
title=サンプルです
description="このデータサンプルです\nサンプルスペース( )"
language=ja

; オプション
[options]
mobile=off

書き方のセクションで説明した、コメントとグループ化を行うセクションの設定とパラメータを記載しています。

実際にこのINIファイルを読み込むコードが下記になります。

import configparser

config = configparser.ConfigParser()
config.read('./sample.ini')

configparserをインポートして、ConfigParserを呼び出します。

呼び出したConfigParserのオブジェクトを使ってread関数でINIファイルを呼び出します。

セクションの抽出

セクションの抽出をしてみます。

セクションは[]で括られた項目になります。

INIファイルは、読み込みで利用したINIファイルを使います。

import configparser

config = configparser.ConfigParser()
config.read('./sample.ini')

print(config.sections()) # 結果 ['settings', 'options']

全部のセクションを取得するには、sections関数を利用します。

そうすることで、設定されたセクションのリストを返します。

セクションの有無を確認

セクションの有無を判定します。

判定する関数は、has_sectionになります。

has_section(判定したいセクション名)

セクションの抽出でも利用している、INIファイルを使います。

import configparser

config = configparser.ConfigParser()
config.read('./sample.ini')

print(config.has_section('settings')) # True
print(config.has_section('member')) # False

settingsはINIファイルの中にあるので、Trueを返します。

しかし、memberというセクションは無いのでFalseを返しています。

パラメータの値を取得

パラメータの取得は、辞書型のようにアクセスします。

下記が取得するコードになります。

import configparser

config = configparser.ConfigParser()
config.read('./sample.ini')

print(config['settings']['title']) # 結果 サンプルです

セクションとパラメータを日本語として認識できるか実験

セクション名とパラメータを日本語で設定した場合、エラーになるのか気になったので試してみます。

試すINIファイルは下記になります。

[設定]
言語=日本語

import configparser

config = configparser.ConfigParser()
config.read('./jp.ini')

print(config['設定']['言語']) # 結果 日本語

問題なく、日本語の設定でも動作することができました。

この実験で気づいたことがあります。

セクション名を指定しないと「File contains no section headers.」というエラーがでます。

下記がそのINIファイルになります。

;[設定]
言語=日本語

設定をコメントアウトして、言語だけを取得してみました。

実際に出たエラーが下記になります。

configparser.MissingSectionHeaderError: File contains no section headers.
file: './jp.ini', line: 2
'言語=日本語'

INIファイルの新規作成

INIファイルを新規で作成する方法は、ファイルの読み書きでよく利用するopen関数を使います。

書き込みなので、モードのオプションはwになります。

オプション関連について知りたい場合は、テキストを操作する記事で書いていますのでご確認ください。

Pythonでテキストファイルの操作
PythonでTEXTを操作!読み込みから書き込みまでの基本
Pythonを使ったテキストを操作するために、読み込みから書き込みといった使い方を解説します。 読み込みに関しては、1行ずつ読み込んだり読み込んだファイルをリスト化したりといった手法もサンプルコードを元に説明しています。 他にもPython ...

続きを見る

実際に新規作成するコードは下記になります。

import configparser

config = configparser.ConfigParser()
config['setting'] = {'language': 'jp', 'max_count': 100}
config['admin'] = {}
config['admin']['user_id'] = 'admin'
config['admin']['password'] = 'admin'
config['admin']['role'] = 'admin'

with open('./write.ini', 'w') as f:
    config.write(f)

読み込みと同じく、ConfigParserでオブジェクトを取得します。

configにsettingというパラメータを作っています。

settingの中にlanguageとmax_countというパラメータをセットします。

もう一つのパラメータのセット方法が、adminの部分になります。

config['admin'] = {}の部分ですが、直接データを入れるので不要と思って最初は書きませんでした。

しかし、admin部分がセクションの扱いになるので、一旦初期化する必要があります。

初期化しないとエラーになります

実際に作成できたファイルの中身は、下記にあります。

[setting]
language = jp
max_count = 100

[admin]
user_id = admin
password = admin
role = admin

セクションの追加

セクションを追加する方法は、カンタンに行うことができます。

利用する関数は、add_sectionになります。

読み込むINIファイルは、新規書き込みで作成したwrite.iniファイルを利用します。

import configparser

config = configparser.ConfigParser()
config.read('write.ini')
config.add_section('members')

with open('./write.ini', 'w') as f:
    config.write(f)

add_sectionでmembersというセクションを追加して、write.iniに保存しています。

下記が、書き込まれた内容です。

[setting]
language = jp
max_count = 100

[admin]
user_id = admin
password = admin
role = admin

[members]

パラメータを追加

パラメータを追加してみます。

セクションの追加で利用したwrite.iniとコードを利用してみます。

import configparser

config = configparser.ConfigParser()
config.read('write.ini')
config.add_section('members')
config['members'] = {'name': 'Python太郎'}

with open('./write.ini', 'w') as f:
    config.write(f)

これを実行すると、エラーになります。

理由としてセクションの追加ので利用したINIファイルには、すでにmembersのセクションが追加されていた為です。

よって、「configparser.DuplicateSectionError: Section 'members' already exists」のエラーがでます。

INIファイルにあるmembersセクションを消して、再度実行するとエラーがでずに下記のように書き込まれます。

[setting]
language = jp
max_count = 100

[admin]
user_id = admin
password = admin
role = admin

[members]
name = Python太郎

すでにあるセクションに対して、パラメータを追加する方法はどうやるのか?

追加する方法は、set関数を使います。

先ほど作成した、membersにageを追加してみます。

import configparser

config = configparser.ConfigParser()
config.read('write.ini')
config.set('members', 'age', '20')

with open('./write.ini', 'w') as f:
    config.write(f

setの第1引数が、セクション名になり、第2引数がパラメータ名になります。

第3引数は、どのような値も文字列としてセットする必要があります

実行すると下記のように、membersのageパラメータが追加されたのがわかります。

[setting]
language = jp
max_count = 100

[admin]
user_id = admin
password = admin
role = admin

[members]
name = Python太郎
age = 20

セクションの削除

セクションを削除するには、remove_sectionを利用します。

パラメータの追記で作成したmembersセクションを削除してみます。

import configparser

config = configparser.ConfigParser()
config.read('write.ini')
config.remove_section('members')

with open('./write.ini', 'w') as f:
    config.write(f)

remove_sectionをしていすることで、membersセクションが削除されます。

[setting]
language = jp
max_count = 100

[admin]
user_id = admin
password = admin
role = admin

まとめ

Pythonの標準機能にある、ConfigParserを使ってINIファイルを操作しました。

このINIファイルはWindowsのINIファイルではなく、Python用のINIファイルの構造になります。

その為、Windowsの操作とは全く別モノになります。

操作してみて、カンタンな設定によるアプリケーション構築などは、このINIファイルで作成しても十分です。

アプリケーションを作る際には、設定ファイルの方法として検討してみるのも良いかもですね。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-,