configparser读写

Hyp*_*ube 2 python read-write 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打开之前,唯一的备份解决方案是什么?

编辑:

以下也是可能的,但是安全吗?

a.write(open('data.txt','w'))
Run Code Online (Sandbox Code Playgroud)

Cat*_*lus 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')
Run Code Online (Sandbox Code Playgroud)