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()

它只会将一个条目写入文件,如下所示:

$ 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(),并且从 shell 快速连续调用脚本,也会发生这种情况。我认为一旦 Python 退出,任何要写入磁盘的内容都会写入磁盘。这是怎么回事?

环境:Mac OS X 10.8 上的 Python 2.7.3

4

2 回答 2

3

这里的问题是您在配置文件中使用的键值是一个分辨率为 1 秒的时间戳。这意味着,当您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")

Mybe 你想要这样的东西所以该部分被打印一次,你可以向它添加多个项目:

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

如您所见,您应该一次性完成,而无需多次调用您的函数。

于 2012-10-11T06:19:54.863 回答