python - 在运行时重写配置文件
问题描述
我在 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 文件。
所有操作都在同一个驱动器上执行,因此即使文件很大,也不会再访问磁盘(重命名除外)。
推荐阅读
- magento - 将客户重定向到客户登录网站 Magento 2 的产品页面
- mongodb - 如何使用groovy从mongodb集合中的字段中将值存储在变量中?
- javascript - 将焦点集中在表格的一列
- arrays - csv 外部表的 presto 语法,其中一个字段包含数组
- java - 在 Java 中将信息从一个端口传递到另一个端口
- php - 重命名路由 url 连接:null
- elasticsearch - 如何旋转 ELK 日志?
- java - Hibernate + Spring Boot:有什么方法可以使用可连接的实体?
- ansible - Ansible 嵌套循环在清单组中的所有主机上运行校验和
- boolean - 如何简化(扩展)这个布尔表达式?