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

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

ただいまの
回答率

88.59%

Python2.7におけるiniファイルの一部書き換え方法についてご教示ください

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,551

Yoichinn

score 16

Python2.7にてiniファイルの内容書き換えを行いたいと考えております。

具体的には、iniファイル内のtestmodeの値を
0を1
または
1を0
に書き換えを行いたいのです。

現状、書き換えには成功しています。
しかし、iniファイル内の改行およびコメントが欠損してしまい
元の形から変わってしまいます。
これを元の形を維持したまま、書き換えを行うようにしたいと考えています。

(起こっている事象)
■元のiniファイルの中身

#テストモード判定
0なら本番、1ならテスト
[testmode]
test_mode:0

##何台目のPCなのかを判定
[pc_number]
pc_num : 1
・・・・

上記が以下のように表示されるように変更

■変更後のiniファイルの中身

[testmode]test_mode = 1[pc_number]pc_num = 0・・・

iniファイルは管理者以外も触る必要があるため、元の形状を保持した状態で書き換えをしたいと考えております。
また、iniファイルを2つ準備し、切替させることも考えましたが、頻繁にiniファイルの書き換えが発生するため、管理上、切替をしないようにしたいと考えております。

 該当のソースコード

※python2.7

path3 = os.path.abspath(u"C:\\Python\\INI\\settting.ini")
inifile = ConfigParser.SafeConfigParser()
inifile.read(path3)

#aの値は別途持ってくるようにしてあります
if a == u"テストモード":
    inifile.set("testmode", "test_mode", "1")
    with open(path3,'wb') as f:
        inifile.write(f)
elif a == u"本番モード":
    inifile.set("testmode", "test_mode", "0")
    with open(path3,'wb') as f:
        inifile.write(f)
else:
    inifile.set("testmode", "test_mode", "1")
    with open(path3,'wb') as f:
        inifile.write(f)

わかりづらい点もあるかと思いますが、アドバイスいただけますでしょうか。
宜しくお願いいたします。

※上記コードの参考URL
https://symfoware.blog.fc2.com/blog-entry-1589.html

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

動作未検証ですがUpdate INI file without removing comments
によるとConfigObjを使うと、コメントを残して.iniの編集ができるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 13:44

    ご回答頂きありがとうございます。
    早速試してみました。

    そうしたところiniファイルの読み込み時にエラーが発生いたしました。
    ※iniファイル内の「:」の記述を「=」に変更してみましたが、エラー発生している行数が6行目から80行目に変更となりました
    解消方法がわかるようでしたらご教示いただけませんでしょうか。
    お手数おかけして申し訳ありません。

    #エラー内容:
    '''text
    Traceback (most recent call last):
    File "start.py", line 105, in <module>
    config = ConfigObj(path3)
    File "C:\Python27\lib\site-packages\configobj.py", line 1229, in __init__
    self._load(infile, configspec)
    File "C:\Python27\lib\site-packages\configobj.py", line 1318, in _load
    raise error
    configobj.ConfigObjError: Parsing failed with several errors.
    First error at line 80.
    '''

    以下が、修正したコードです
    '''python
    path3 = os.path.abspath(u"C:\\Python\\INI\\settting.ini")
    config = ConfigObj(path3)

    #aの値は別途持ってくるようにしてあります
    if a == u"テストモード":
    config['testmode']['test_mode'] = '1'
    config.write()
    elif a == u"本番モード":
    config['testmode']['test_mode'] = '0'
    config.write()
    else:
    config['testmode']['test_mode'] = '1'
    config.write()
    '''

    キャンセル

  • 2018/12/04 13:52

    動作未検証ですが.iniの80行目付近を提示されると回答得られやすいかと思います。

    キャンセル

  • 2018/12/04 14:06

    ご確認頂きありがとうございます。
    iniファイルの内容を76行目から記載いたします。
    ※個別のメールアドレスが含まれているためイメージでの記載となります。

    iniの80行目に関してはgmail2のGmail_bccの値が格納されている部分となります。

    76行目~

    #地域A
    [gmail2]
    Gmail_to =
    Gmail_cc =
    Gmail_bcc = メールアドレスが40個ほどカンマ区切りで入っています

    #地域B
    [gmail3]
    Gmail_to =
    Gmail_cc =
    Gmail_bcc = a@gmail.com,b.gmail.com,・・・・,z@yahoo.co.jp

    以下、同様に地域ごとの宛先をiniファイルに格納しております

    キャンセル

  • 2018/12/04 14:19

    can110さん

    ご指摘いただいた点を元に確認いたしました。
    おっしゃるとおりiniファイルの80行目を詳細確認いたしました。
    そうしたところ、カンマが2つ連なってある箇所があったためひとつに変更いたしました。
    これにより、スクリプトが動くようになりました。

    ありがとうございました!

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る