假设我有两个Python脚本。一个脚本是一个Web界面,使人可以编辑配置文件。另一个脚本是基于该文件中定义的配置在后台执行各种操作的脚本,它在循环中每隔几秒重新加载一次。
这种配置文件的格式是什么?我希望这种格式具有人类可读性和人性化的可编辑性,同时也易于编写和读取而不会发生冲突。
目前,我认为json
模块可能是一个不错的选择,其中配置本质上是以明文形式保存到文件中的字典,并从该明文文件读入字典。这是一种安全的方法吗?有更好的方法吗?是否有问题是一个脚本试图从文件中读取而另一个脚本正在写入文件?该如何解决?
所以,作为一个简单的例子,这里有两个脚本。一个配置写入JSON纯文本文件,一个从文件中读取配置:
import random
import json
while True:
config = {"a": 1, "b": random.randint(1, 2)}
with open("config.json", "w") as file_config:
json.dump(config, file_config)
import json
while True:
with open("config.json") as file_JSON:
config = json.load(file_JSON)
print(config)
当这两个脚本同时运行时,阅读器脚本会快速生成以下错误:
Traceback (most recent call last):
File "2_script.py", line 5, in <module>
config = json.load(file_JSON)
File "/usr/lib/python3.5/json/__init__.py", line 268, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
该如何解决?
听起来你正在寻找两个功能:
我不知道这两个功能的简单解决方案,但我可以提出一些建议。
至于格式,我会考虑三个选项:1。INI格式 - 老式,但内置的configparser
模块支持2. YAML格式 - 我比JSON更喜欢它,因为它支持注释3. JSON格式 - 流行,但不支持注释:您必须使用特殊属性名称,如“注释”或在解析文件之前删除注释