我使用了两个 JSON 文件,一个用于存储和加载设备变量,另一个用于 mqtt 信息。我正在使用 load_config 函数加载正确的文件,然后将其加载为 JSON。当文件存在时,它可以正常工作,但是当文件不存在时,它显然会抛出一个找不到文件的错误。但是我的函数包含一个异常块来通过创建文件来处理这个,但它没有被调用。这是我的函数代码:
def load_config(config_path):
with open(config_path) as f: #Config
try:
return json.load(f)
except OSError:
print("file not there, creating it")
open(config_path, "w")
except json.JSONDecodeError:
return {}
f.close()
我这样调用这个函数:
DEVICE_PATH = 'config.json'
MQTT_PATH = 'mqtt.json'
conf = load_config(DEVICE_PATH) #load device config
mqtt_conf = load_config(MQTT_PATH) #load mqtt config
mqtt_broker_ip = mqtt_conf['ip'] #setup mqtt
mqtt_broker_port = mqtt_conf['port']
mqtt_user = mqtt_conf['username']
mqtt_pass = mqtt_conf['password']
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(mqtt_user, password=mqtt_pass)
client.connect(mqtt_broker_ip, mqtt_broker_port, keepalive = 60, bind_address="" )
我做错了什么?当我通过 load_config 通过 with open(config_path, "a") as f:
直接打开文件时,其中的所有内容都会被删除,如果文件存在,x 只会抛出异常,而 w 也会被覆盖。
答案 0 :(得分:0)
看看这个https://stackoverflow.com/a/1466036/13950701
您应该使用 w+,而不是 w 来创建文件。
答案 1 :(得分:0)
您想要实现的已经是一个 open()
内置功能。</p>
只需跳过整个文件存在性检查并在 w+
模式下加载 JSON:
with open("file.json", "w+") as f:
try:
data = json.load(f)
except JSONDecodeError:
data = {}
w+
以读写模式打开任何文件,如果文件不存在则创建文件名。
请记住,使用此模式转储任何数据将完全覆盖任何现有文件的内容。
顺便提一下,您可能需要了解一些有关文件处理的基本知识,以免很快陷入类似问题。
答案 2 :(得分:0)
由于我有一个逻辑错误,因此永远不会引发异常 IOError。我打开文件并尝试加载到 json 中。现在我只是事先检查,如果文件不存在,并创建它。
def load_config(config_path):
if not os.path.isfile(config_path):
open(config_path, "w+")
with open(config_path) as f: #Config
try:
return json.load(f)
except json.JSONDecodeError:
return {}