打开一个文件,如果不存在,创建它

时间:2021-06-29 01:03:25

标签: python

我使用了两个 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 也会被覆盖。

3 个答案:

答案 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 {}