2

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

导入配置解析器
数据 = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(数据)
a['example']['test'] = 'red'
a.写(数据)

问题是当我用 r+ 打开数据时,当我向它写入新信息时;它不会覆盖旧的。

导入配置解析器
数据=打开('data.txt','r')
a = configparser.ConfigParser()
a.read_file(数据)
a['example']['test'] = 'red'
数据=打开('data.txt','w')
a.写(数据)

这种方式 ^ 似乎不安全,因为用 w 打开它会清空文件。如果程序还没来得及写就崩溃了怎么办?配置文件丢失。用w打开之前唯一的备份解决方案是什么?

编辑:

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

a.write(open('data.txt','w'))
4

2 回答 2

5

如果你真的很担心,你可以写入一个临时文件,然后将临时文件重命名为这个文件——如果配置写入失败,原始文件将保持不变;rename/move 通常是原子的(尽管在 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')
于 2011-06-30T01:20:05.157 回答
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 中做到这一点的。

于 2018-12-08T03:34:33.287 回答