configparser 读写操作
我正在使用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模式打开文件会清空文件。如果程序在写入之前崩溃了,那配置文件就会丢失。难道唯一的解决办法就是在用w模式打开之前先备份一下文件吗?
编辑:
下面的方法也是一种选择,但这样做安全吗?
a.write(open('data.txt','w'))
2 个回答
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中这样做的。
5
如果你真的很担心这个问题,可以先把内容写到一个临时文件里,然后再把这个临时文件改名为你想要的文件名。这样,如果写配置的过程中出现问题,原来的文件就不会受到影响。改名或移动文件的操作通常是原子性的,也就是说,要么成功,要么失败,不会出现半成品的状态(当然,如果底层的文件系统没有出现严重故障的话)。
# ...
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')