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

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

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

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

Q&A

解決済

1回答

3356閲覧

ファイルの書き換えについて

poemt

総合スコア48

Python 3.x

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

0グッド

0クリップ

投稿2018/10/09 06:18

前提・実現したいこと

.confファイルを書き換えたい

現在pythonでの単体試験を行っているのですが、その際に使用している.confファイルの書き換えが意図した動作になっていなかったため質問させていただきます。

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

.confファイルを書き換えたはずが書き換えられていない。

該当のソースコード

#test.conf #上書きされると消える予定のコメント [test] id = before_id

Python

1#test_target.py 2 3import target 4import configparser 5import unittest 6class TestTarget(unittest.TestCase): 7 conf_file = configparser.SafeConfigParser() 8 conf_file.read('./test.conf') 9 #'id'の中身を保持してから上書きする 10 tmp_id = conf_file.get('test', 'id') 11 conf_file.set('test', 'id', 'after_id') 12 13 with open('./test.conf') as opened_file: 14 conf_file.write(opened_file) 15 #'after_id'と表示されるはず★1 16 print(conf_file.get('test', 'id')) 17 18 target.confirm() 19 20 #元に戻す 21 conf_file.set('test', 'id', tmp_id) 22 with open('./test.conf') as opened_file: 23 conf_file.write(opened_file)

Python

1#target.py 2 3import configparser 4conf_file = configparser.SafeConfigParser() 5conf_file.read('./test.conf') 6 7def confirm(): 8 #なのでここでも書き換えられた値が表示されるはず★2 9 print(conf_file.get('test', 'id')) 10

上記のような形で実行してみたのですが、★1で表示されたのは'after_id'だったのですが、
★2の箇所で表示されたのは'before_id'でした。
★1ですでに書き換えられていることは確認できているのにたいして、実際の★2では書き換える前の値が表示されている理由が見当が付きませんでした。
上記を実行後にtest.confの中身を確認すると更新されていた(コメントが消えていた)ので、
書き換える対象が誤っていたとも思えません。

そうなるとなにかconfigparser の仕様で間違った認識をしているのではないかと思うのですが、
どう間違えているのかまでは分かりませんでした・・・。

初歩的なことが分かっていないだけなのかもしれませんが
なにとぞご教示のほど、よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

python3.5.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

import configparser conf_file = configparser.SafeConfigParser() conf_file.read('./test.conf') def confirm(): #なのでここでも書き換えられた値が表示されるはず★2 print(conf_file.get('test', 'id'))

target.pyconf_file 変数が def confirm() の外で定義されているのはおかしくないでしょうか?
この場合、

  1. import target をしたタイミングで test.conf が読み込まれる。(conf_file 変数に保持)

  2. test_target.py 側で値を書き換える。

  3. target.confirm() を呼び出す。conf_file は書き換え前に設定を読み込んで構築されたオブジェクトなので、状態も書き換え前のものである。これを print しても before_id となる。

以下のように修正してみてはどうでしょうか?

def confirm(): conf_file = configparser.SafeConfigParser() conf_file.read('test.conf') #なのでここでも書き換えられた値が表示されるはず★2 print(conf_file.get('test', 'id'))

その他

書き込みする場合は open() する際に 'w' を第2引数に指定する必要があります。

with open('./test.conf') as opened_file: conf_file.write(opened_file)

with open('./test.conf', 'w') as opened_file: conf_file.write(opened_file)

投稿2018/10/09 06:35

tiitoi

総合スコア21956

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

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

poemt

2018/10/09 06:44

ありがとうございます!上記の方法でうまくいきました! いわれてみれば確かに読み込む位置がおかしかったです。 (open()の'w'については書き漏らしでした。実際のコードをコピペするわけにも行かなかったので手打ちした時に漏らしていました・・・申し訳ありません。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問