configparser读写

时间:2011-06-30 00:57:12

标签: python configparser read-write

我正在使用Python 3.2和configparser模块,并遇到一些问题。我需要阅读,然后写入配置文件。我尝试了以下方法:

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
a.write(data)

问题在于,当我使用r +打开数据时,当我写入数据时,会附加新信息;它不会覆盖旧的。

import 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'))

2 个答案:

答案 0 :(得分:5)

如果您真的担心这一点,您可以写入临时文件,然后将临时文件重命名为此文件 - 如果配置写入失败,原始文件将保持不变;重命名/移动通常是原子的(虽然在Windows下你可能需要直接调用MoveFileEx,而不是使用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')

答案 1 :(得分: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可以像往常一样使用空文件对象进行处理。

应该注意,我是在Python 3中完成的。