为什么在open()写入上下文内调用configparser.read会覆盖原有文件内容?
问题原因解答
核心问题出在文件打开模式的特性和代码执行顺序的冲突,具体逻辑如下:
- 首先你需要明确Python内置
open()函数使用w(写入模式)打开文件的默认行为:调用该语句的瞬间就会直接清空目标文件的所有原有内容,仅保留空文件等待写入新内容。 - 第一种错误写法的执行流程:
- 先执行
with open(file, "w") as f:,这一步执行完成后,你原本的ini配置文件就已经被清空了,原有second_api_key的配置直接被删除。 - 再执行
config.read(file),此时读取的是已经被清空的空文件,config对象里没有加载到任何原有配置项,只有你后续手动赋值的first_api_key。 - 最后
config.write(f)写入的只有当前config对象里存在的单个配置项,自然就丢失了原有内容。
- 先执行
- 第二种正确写法的执行流程:
- 先执行
config.read(file),此时读取的是完整的原始配置文件,所有原有配置项都被加载到了config对象中。 - 再用
w模式打开文件清空原有内容,修改config对象中指定的配置项后,将包含所有原有配置+修改后配置的完整内容写入文件,自然不会丢失配置。
- 先执行
额外建议:如果担心误操作丢失配置,可以先将修改后的内容写入临时文件,校验没问题后再替换原配置文件,避免数据丢失。
内容的提问来源于stack exchange,提问作者ConorBaumgart
相关产品推荐
相关产品推荐

