configparser 读写操作

2 投票
2 回答
7429 浏览
提问于 2025-04-16 20:33

我正在使用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')

撰写回答