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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Python

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

Q&A

解決済

2回答

15457閲覧

Python configparserで設定ファイルにコメント行を書き込みたい。

Nishizawa1

総合スコア3

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Python

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

0グッド

0クリップ

投稿2020/06/18 10:54

Pythonのconfigparserを用いて設定ファイルを読み書きしています。
設定値の変更等は簡単に実装できるのですが、コメント行の扱いに困っています。

具体的には、読み込み時に記載していたコメント行が、書き出しの際に設定値のみ書き込みが行われ、
コメント行は書き込まれません。

特にconfigparserにこだわっているわけではないのですが、解決方法があればご教授ください。

###該当のソースコード

Python

1import configparser 2 3config_ini = configparser.ConfigParser() 4config_ini.read('config', encoding='utf-8') 5 6config_ini.set('DEFAULT', 'test', 'TEST1') 7 8with open('config1', 'w', encoding='utf-8') as file: 9 config_ini.write(file)

config

1# 残したいコメント 2[DEFAULT] 3test = TEST

###実行結果

config1

1[DEFAULT] 2test = TEST1

###実現したいこと
設定ファイルに入力されている値を実行内容によって、上書きしたい時がある。
その際、configparserのwrite()を用いて設定ファイルを上書きすると、
設定値は実行中に変更したかどうかにかかわらず、すべて綺麗に書き出される。
一方、読み込み時に記載していたコメント行は書き出されず、消えてしまう。

下記のように書き出したファイルに、読み込んだファイルのコメント行を継承させたい。

config1

1# 残したいコメント 2[DEFAULT] 3test = TEST1

###補足情報
OS:Windows10
OSバージョン:1909
OSビルド:18363.900
Python: 3.7.7

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

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

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

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

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

guest

回答2

0

ConfigParserの引数comment_prefixesに'/'を指定すると、コメント行が値のない行として扱われるらしく、書き込み時に消えません。
また、allow_no_valueをTrueに指定することで、コメント行のパースエラーを回避します。

参照:https://stackoverflow.com/questions/21476554/update-ini-file-without-removing-comments

import configparser config_ini = configparser.ConfigParser(comment_prefixes='/', allow_no_value=True) # <--修正 config_ini.read('config', encoding='utf-8') config_ini.set('DEFAULT', 'test', 'TEST1') with open('config1', 'w', encoding='utf-8') as file: config_ini.write(file)

ただし、質問文のようにconfigファイルの一番最初の行が「#」で始まっている場合、上記を実行するとエラーが発生しました。
手元の環境だと、[DEFAULT]を一番最初に置き、次の行以下にコメント置くと正常に実行できました。

投稿2020/06/18 12:02

編集2020/06/18 12:03
patapi

総合スコア820

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

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

Nishizawa1

2020/06/18 12:12

ご回答ありがとうございます。 なるほど!な解決策ですね。 確かに[DEFAULT]を最初に持っていくと、コメントが消えず残ってくれました。 この方法であれば標準ライブラリで対応できるので楽ですね。 今回はファイルの先頭にコメントを書きたかったので、先の回答者のConfigObjを使おうと思います。 ありがとうございました。
guest

0

ベストアンサー

Update INI file without removing commentsの回答にてConfigObjが紹介されています。
動作は確認していませんので使い勝手などは分かりませんがconfigobj 5.0.6によると

All comments in the file are preserved

だそうです。

投稿2020/06/18 11:44

編集2020/06/18 11:45
can110

総合スコア38341

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

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

Nishizawa1

2020/06/18 12:08

ご回答ありがとうございます。 ConfigObjを使用すると、以下のコードで実現したいことを達成できました。 ```Python import configobj config = configobj.ConfigObj('config', encoding='utf-8') config['DEFAULT']['test'] = 'TEST1' config.write() ``` ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問