Python 在运行时重写配置文件

Python 在运行时重写配置文件,python,python-3.x,configuration-files,Python,Python 3.x,Configuration Files,我正在通过python3.7.1中的configparser使用配置文件。 我想在运行时修改其中一个文件中的一个变量,我想知道最好的方法是什么 现在,我将整个文件重写为: config = configparser.ConfigParser() config.read('config.ini') config['Categorie']['new_variable'] = variable with open('config.ini', 'w') as configfile: config

我正在通过python3.7.1中的configparser使用配置文件。
我想在运行时修改其中一个文件中的一个变量,我想知道最好的方法是什么

现在,我将整个文件重写为:

config = configparser.ConfigParser()
config.read('config.ini')
config['Categorie']['new_variable'] = variable
with open('config.ini', 'w') as configfile:
    config.write(configfile)
我对这种方法有两个顾虑:
-出现错误时可能会丢失配置

-每次删除文件中的注释


另一种方法是使用两个文件,其中一个文件专用于运行时修改的变量

configparser
不存储注释,因此除非您不使用此模块,否则您只能使用该文件。。。或者,您可以提取注释,然后将其重新输入到文件中(丢失注释的位置,但保留内容)

为了避免在出现错误(磁盘已满或其他)时丢失配置,可以另存为其他名称,删除当前文件并重命名

conf_file = 'config.ini'
with open(conf_file+'.bak', 'w') as configfile:
    config.write(configfile)
if os.path.exists(conf_file):
   os.remove(conf_file)  # else rename won't work when target exists
os.rename(conf_file+'.bak',conf_file)
这种方法是安全的。如果无法写入文件,则不会删除上一个文件。最糟糕的情况是(如果有人在删除原始文件的确切时刻拔出插头,
.bak
文件(包含正确的新内容)仍然保留

另一种方法是重命名现有的.ini文件,写入新文件,并在成功写入文件后删除旧的.ini文件

所有操作都在同一个驱动器上执行,因此即使文件很大,也不会再访问磁盘(重命名除外)。

config.ini

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = {somelevel}
ForwardX11 = yes
python代码

content = open('config.ini').read()
somelevel = 34
filled = content.format(**locals())
gg = ConfigParser()
gg.read_string(filled)
但是,不要对实际代码使用**locals()。 试着找一个更好的方法,这是肮脏的


编辑:我尝试了一些简单的f字符串破解,但由于转义问题而失败。

“每次删除文件中的注释”:如果您不想这样做,就不要使用
configparser
如果您想保留注释,我建议切换到YAML并使用包。至于安全更新-写入新文件(即
file.new
),删除旧文件(即
file.conf
),将新文件重命名为默认名称(即
file.conf
)。读取配置时,请尝试读取默认名称(
file.conf
),如果不可用,请尝试读取新配置(
file.new
),以防上次更新时重命名失败。或者,使用数据库(
sqlite
应该可以)进行配置,并依赖DB引擎实现原子性。这确实允许我保留注释,但我认为这样会更难控制文件的格式