0

次のスクリプトがあるとします。

import ConfigParser
from datetime import datetime
import time

def write_stuff():
    section = "test"
    item = "oh hey there"
    conf_filename = "test.conf"

    conf = ConfigParser.ConfigParser()
    conf.readfp(open(conf_filename, 'r', 0))

    timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")

    conf.set(section, timestamp, item)

    with open(conf_filename, "w", 0) as conf_file:
        # time.sleep(1)
        conf.write(conf_file)

write_stuff()
write_stuff()
write_stuff()
write_stuff()

次の図に示すように、ファイルには 1 つのエントリのみが書き込まれます。

$ touch test.conf
$ python tests.py  # this is what I've named the above
$ $ cat test.conf
[test]
2012-10-10_231439 = oh hey there

ただし、time.sleep(1) のコメントを外すと、すべてのエントリが表示されます。奇妙なことに (とにかく、私には) これは、write_stuff() への呼び出しが 1 つあり、シェルからスクリプトをすばやく連続して呼び出した場合でも発生します。Python が終了すると、ディスクに保存されるものはすべてディスクに保存されると思います。どうしたの?

環境: Mac OS X 10.8 上の Python 2.7.3

4

2 に答える 2

3

ここでの問題は、構成ファイルで使用しているキー値が1秒の解像度のタイムスタンプであるということです。つまり、4回続けて呼び出す場合write_stuff()、時刻は変更されず、タイムスタンプも変更されず、新しい値を追加するのではなく、単に前の値を上書きするだけです。

あなたがする必要があるのは、毎回一意のキー値を生成することです。タイムスタンプ値を保持したい場合は、これが機能します。

count = 0

def write_stuff():
    global count

    section = "test" 
    item = "oh hey there" 
    conf_filename = "test.conf" 

    conf = ConfigParser.ConfigParser() 
    conf.readfp(open(conf_filename, 'r', 0)) 

    timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")+ "_%s" % count
    count += 1

    conf.set(section, timestamp, item) 

    with open(conf_filename, "w", 0) as conf_file: 
        conf.write(conf_file) 

構成ファイルに書き込まれる値は特定の順序ではないことに注意してください。

于 2012-10-11T08:48:18.127 に答える
2

同じエントリを何度も書き込んでいます。ファイルを追加する"a"代わりに使用します。"w"

with open("test.txt", "a") as myfile:
    myfile.write("appended text")

このようなものが必要な場合は、セクションが一度印刷され、複数のアイテムを追加できます。

config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'wb') as configfile:
    config.write(configfile)

出力:

[Section1]
bar = Python
baz = fun
a_bool = true
an_int = 15
foo = %(bar)s is %(baz)s!
a_float = 3.1415

ご覧のとおり、関数を複数回呼び出すことなく、1 回の書き込みで実行する必要があります。

于 2012-10-11T06:19:54.863 に答える