我正在使用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'))
答案 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中完成的。