質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2976閲覧

Python Configparserによる重複セクションや重複キーの全てのバリューの取得

junk.

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/06 02:10

前提・実現したいこと

プログラミング初心者です。
PythonのConfigparserというライブラリを使用して、下記example.iniファイルの解析をしたいと思い、試しにtest.pyファイルを書きました。

exapmle.iniには重複する名前のsectionやkeyが存在しており、configparserで全ての値を取得したいです。
iniファイルの重複セクションや重複キーから全てのバリューを取得するには、どうしたらいいでしょうか。
目的が達成されるのであれば、configparserを使用しない方法でも構いません。

発生している問題・エラーメッセージ

configparserでは一つのセクションやキーに対して、取得できるvalueが一つのようで、重複したキーから取得された値は上書きされて、最後のvalueのみが取得されてしまいます。

出力結果は

DOC_TABLES "カレントリビジョン","CUR_REVISION","@INT","NOT NULL",,"0","",$FFFFFFFF,""

となってしまいます。

該当のソースコード

exampl.ini

[Entity] PName=DOC_INDEXES LName=インデックスマスタ Field="テーブルID","TAB_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" Field="インデックスID","COL_ID","@INT","NOT NULL",1,"","",$FFFFFFFF,"" [Entity] PName=DOC_TABLES LName=[1]テーブルマスタ Field="テーブルID","TAB_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" Field="カレントリビジョン","CUR_REVISION","@INT","NOT NULL",,"0","",$FFFFFFFF,""

test.py

# coding:utf-8 import configparser config_ini = configparser.ConfigParser(strict=False) config_ini.read('example.ini', encoding='utf-8') read_default = config_ini['Entity'] var1 = read_default.get('PName') var2 = read_default.get('Field') print(var1) print(var2)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

configparserは内部でdictを継承してデータを保存しているため、重複キーを扱うことは基本的に出来ません。(独自の辞書クラスを作ってdict_typeに指定するということも出来るかもしれませんが難しいと思います)

やるとしたら、事前に重複したセクションやキーを連番付きに置換してからconfigparserを使うか、configparserクラスを継承して大幅に書き換えるか、単なるテキストファイルとして読み取って文字列処理で読み取っていくか、という感じになると思います。

投稿2020/06/06 05:59

x98000

総合スコア1096

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2020/06/06 13:45

類似トピックのdict_typeに指定する実装です https://stackoverflow.com/questions/15848674/how-to-configparse-a-file-keeping-multiple-values-for-identical-keys ただ、リストに入れること自体は可能でも、 どのキーをリストにするかが解らなければ、 リストとして欲しい項目と、単体の値として欲しい項目の判断が必要で 設定の値を得る時に少し複雑になりますね。 もし、設定ファイル側のオプション名の仕様が変更可能なら キーの末尾が [] の場合にリストにする案が良さそうだと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問