2

Python 3.2とconfigparserモジュールを使用していますが、いくつかの問題が発生しています。構成ファイルを読み取ってから書き込む必要があります。私は次のことを試しました:

configparserをインポートします
data = open('data.txt'、'r +')
a = configparser.ConfigParser()
a.read_file(data)
a ['example'] ['test'] ='red'
a.write(data)

問題は、r +でデータを開くと、それに書き込むと新しい情報が追加されることです。古いものを上書きしません。

configparserをインポートします
data = open('data.txt'、'r')
a = configparser.ConfigParser()
a.read_file(data)
a ['example'] ['test'] ='red'
data = open('data.txt'、'w')
a.write(data)

このように^を開くとファイルが空になるため、^は安全ではないようです。書く時間がなくなる前にプログラムがクラッシュした場合はどうなりますか?構成ファイルが失われます。wで開く前にバックアップする唯一の解決策はありますか?

編集:

以下も可能ですが、安全ですか?

a.write(open('data.txt','w'))
4

2 に答える 2

5

それが本当に心配な場合は、一時ファイルに書き込んでから、一時ファイルの名前をこのファイルに変更できます。構成の書き込みが失敗した場合、元のファイルは変更されません。名前の変更/移動は通常アトミックです(ただし、WindowsMoveFileExでは、を使用する代わりに直接呼び出す必要がある場合がありos.renameます)。したがって、古いコンテンツまたは新しいコンテンツのいずれかがあり、ファイルがどのコンテンツにも含まれないことを確認できます。その他の状態(もちろん、基盤となるファイルシステムの重大な障害はありません)。

# ...
a['example']['test'] = 'red'

import tempfile, os
with tempfile.NamedTemporaryFile() as tmp:
    a.write(tmp)

    # or ctypes.windll.kernel32.MoveFileExW(tmp.name, 'data.txt', 2)
    # 2 = MOVEFILE_REPLACE_EXISTING 
    # I'll leave wrapping it in a cross-platform manner up to you
    os.rename(tmp.name, 'data.txt')
于 2011-06-30T01:20:05.157 に答える
0

これは、私が同様のシナリオに遭遇したときに行うことです。

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
data.truncate(0)#<--
data.seek(0)#<--
a.write(data)

これにより、ファイルオブジェクトがゼロに切り捨てられます。次に、ファイルの先頭へのポインタをリセットします。その後、configparserは、空のファイルオブジェクトを使用して通常どおりに続行できます。

これはPython3で行ったことに注意してください。

于 2018-12-08T03:34:33.287 に答える