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

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

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

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

Q&A

解決済

1回答

2663閲覧

python3 configparserの使い方

yujin5296

総合スコア16

Python

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

0グッド

0クリップ

投稿2020/05/31 06:26

編集2020/05/31 08:31

configparserをモジュール化?して使いたいと考えています。

しかし、下記コードで実行するとエラーに下記のエラーが出てしまいます。

.readはコンストラクタの中で実行していますが
get関数の中で実行してもうまくいきませんでした。

原因がわかる方がいらっしゃいましたらご教授願います。

  • settings_utils.py
import os import configparser from utils.logger import Logger # ログ出力クラス. log = Logger('SettingsUtils') #------------------------------------------------------------------------------- # コンフィグ管理クラス. #------------------------------------------------------------------------------- class SettingsUtils(): #--------------------------------------------------------------------------- # コンストラクタ. #--------------------------------------------------------------------------- def __init__(self): # 設定ファイルのインスタンス. self.config = configparser.ConfigParser() try: # リソースパス. filePath = './../settings.ini' # 設定ファイルを読み込む. self.config.read(filePath) except: log.fatal("unexpected error: ") #--------------------------------------------------------------------------- # 設定値の取得処理. #--------------------------------------------------------------------------- def get(self, name): result = '' try: result = self.config.get('SETTINGS', name) except: log.fatal("unexpected error: ") return result
  • エラーログ
2020-05-28 21:37:20,040 [CRITICAL] SettingsUtils( 32356): unexpected error: Traceback (most recent call last): File "/usr/lampnetrepeater/app/utils/settings_utils.py", line 58, in get result = self.config.get('SETTINGS', name) File "/usr/lib/python3.7/configparser.py", line 780, in get d = self._unify_values(section, vars) File "/usr/lib/python3.7/configparser.py", line 1146, in _unify_values raise NoSectionError(section) from None configparser.NoSectionError: No section: 'SETTINGS'
  • settings.ini
[DEFAULT] 〇〇〇〇 = 〇〇〇〇 〇〇〇〇 = 〇〇〇〇 [SETTINGS] 〇〇〇〇 = 〇〇〇〇 〇〇〇〇 = 〇〇〇〇

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

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

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

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

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

pea

2020/05/31 07:52

settings.iniの中身は記載可能でしょうか? エラー内容はINIファイルの中に[SETTINGS]セクションがないということのようです。
x98000

2020/05/31 08:25

'./../settings.ini' のファイルパスは正しいか(別のディレクトリ見てたとか)、その中に[SETTINGS]があるか、確認してみてください。
yujin5296

2020/05/31 08:33

iniファイルを追記いたしました 申し訳ございませんが、内容は伏せさせていただいております。 ファイルパスも場所は違いますが、相対パスで記載しています。 (パスは合っているはずです...)
x98000

2020/05/31 09:10

うーん、おかしいですね。 result = self.config.get('SETTINGS', name) を、 result = self.config['SETTINGS'][name] に変えても同じですかね。 あと、文字コードはどうなってますかね。
yujin5296

2020/05/31 09:22

result = self.config['SETTINGS'][name] ↑で実行したところ result = self.config['SETTINGS'][name] File "/usr/lib/python3.7/configparser.py", line 958, in __getitem__ raise KeyError(key) KeyError: 'SETTINGS' が出てしまいます。 文字コードは、実行環境がラズパイなのでutf-8のLFにして保存し直してみましたが 状況は変わらずです...
x98000

2020/05/31 09:56

やはり、ファイルをうまく認識していないように見えます。 print(self.config.sections()) でセクション一覧が出ますか? ファイルの置き場所を変えたり別のセクションを指定して違いは出ませんかね。
yujin5296

2020/05/31 10:11

log.info(self.config.sections()) 上記実行で SettingsUtils( 17653): [] となっていました おっしゃるとおり、ファイルの認識がうまくいっていなさそうなので 置き場所を変えたりしてみます。
yujin5296

2020/05/31 10:16

filePath = './settings.ini' iniファイルを「settings_utils.py」と同じ階層において、実行いたしましたが 結果は変わらずでした。
x98000

2020/05/31 10:47

ちょっと試してみましたが、指定したファイルが無くてもconfig.read(filePath)は失敗しませんね。 os.path.exists(filePath)でファイルの存在確認してみるとか、os.getcwd() でpythonが認識しているカレントディレクトリを確認してみるとかやってみましょう。
yujin5296

2020/05/31 10:49

ありがとうございます! 試してみます!
guest

回答1

0

自己解決

ファイルパスの指定をos.pathで継ぎ足していく形にすると実行できました。
下記参照

# リソースパス. filePath = os.path.dirname(os.path.abspath(__file__)) filePath = os.path.dirname(filePath) filePath = os.path.dirname(filePath) filePath = os.path.join(filePath, 'assets') filePath = os.path.join(filePath, 'settings') self.filePath = os.path.join(filePath, 'settings.ini')

投稿2020/06/03 05:11

yujin5296

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問