Проверьте, существует ли файл, и создайте его, если он не

Я попробовал "try: catch", но ничего не вышло. Полагаю, я мог бы изменить его на оператор if, но не понимаю, почему это не работает. Это мой самый первый «настоящий» проект. Я строю контроллер полива и создаю словарь графиков полива. Первый - это код, который у меня есть, а второй код - это сам по себе «тест», который я пытаюсь выполнить. Каждый раз, когда я запускаю код, он перезаписывает существующий файл, когда я хочу, чтобы он открыл файл, если он уже существует, и НЕ записал его снова.

# timer will first look for a saved file(dictionary) of already recorded
# irrigation times.  If no file exists it will create one.  

# irrigation timer which does scheduled irrigation as well as cyclic   irrigation for propagating plants.
# uses a lcd 1602 display
# will use up to 10 different valves

import time
import datetime
import threading
import RPi.GPIO as GPIO
from RPLCD import CharLCD # http://www.circuitbasics.com/raspberry-pi-lcd-set-up-and-programming-in-python/

GPIO.setmode(GPIO.BOARD)

# pinouts for lcd pins
lcd = CharLCD (cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23]) 

# valve pins
valve_1 = 8
valve_2 = 10
valve_3 = 12
valve_4 = 16
valve_5 = 18
valve_6 = 22
valve_7 = 24
valve_8 = 26
valve_9 = 32
valve_10 = 36

# setup valve pins as outputs
GPIO.setup(valve_pin1, GPIO.OUT)
GPIO.setup(valve_pin2, GPIO.OUT)
GPIO.setup(valve_pin3, GPIO.OUT)
GPIO.setup(valve_pin4, GPIO.OUT)
GPIO.setup(valve_pin5, GPIO.OUT)
GPIO.setup(valve_pin6, GPIO.OUT)
GPIO.setup(valve_pin7, GPIO.OUT)
GPIO.setup(valve_pin8, GPIO.OUT)
GPIO.setup(valve_pin9, GPIO.OUT)
GPIO.setup(valve_pin10, GPIO.OUT)

#set all valve pins to off
GPIO.output(valve_pin1, False)
GPIO.output(valve_pin2, False)
GPIO.output(valve_pin3, False)
GPIO.output(valve_pin4, False)
GPIO.output(valve_pin5, False)
GPIO.output(valve_pin6, False)
GPIO.output(valve_pin7, False)
GPIO.output(valve_pin8, False)
GPIO.output(valve_pin9, False)
GPIO.output(valve_pin10, False)

# check to see if a schedule has been saved
def sched_check()
    try:
        file = open("schedule.dat", "r")
        schedule = schedule.read()
        file.close()
    # create a list of schedule dictionaries
    except:
        schedule_list = []
        for schedule_number in range(10):
            schedule = {
                                        "timed" : {
                                                  "watering_days" : [],
                                                  "watering_times" : [],
                                                  "duration" : "timed_duration",
                                                  },
                                        "cyclic" : {
                                                  "time_on" : "seconds_on",
                                                  "time_off" : "seconds_off",
                                                  "blackout_window_start" : "blkout_time_start",
                                                  "blackout_window_stop" : "blkout_time_stop",
                                                   },
                                        }
            schedule_list.append(schedule)
        file = open("schedule.dat", "w")
        file.write(str(schedule_list))
        file.close()

И это уже проблема.

def sched_check():
    try:
        file = open("schedule.dat", "r")
        schedule = schedule.read()
        file.close()
        print("file already exists")
    # create a list of schedule dictionaries
    except:
        schedule_list = []
        for schedule_number in range(10):
            schedule = {
                                        "timed" : {
                                                  "watering_days" : [],
                                                  "watering_times" : [],
                                                  "duration" : "timed_duration",
                                                  },
                                        "cyclic" : {
                                                  "time_on" : "seconds_on",
                                                  "time_off" : "seconds_off",
                                                  "blackout_window_start" : "blkout_time_start",
                                                  "blackout_window_stop" : "blkout_time_stop",
                                                   },
                                        }
            schedule_list.append(schedule)
        file = open("schedule.dat", "w")
        file.write(str(schedule_list))
        file.close()
        print("new file created")

sched_check()

person Nathan Rigg    schedule 19.06.2017    source источник
comment
Я думаю, schedule = schedule.read() должен быть schedule = file.read()   -  person jacoblaw    schedule 20.06.2017
comment
Когда вы говорите открыть файл и больше не записывать его, вы имеете в виду, что пытаетесь добавить данные в конец файла? или ничего не делать? Если вы хотите добавить данные, вы можете использовать флаг a вместо w и проверить, существует ли файл или нет.   -  person Chiheb Nexus    schedule 20.06.2017
comment
Обратите внимание, что из ответов в справочнике по дублированию тот, что с open(..., 'x'), вероятно, тот, который вам нужен. Это заставляет open() квакать FileExistsError, когда файл, который нужно открыть, уже существует. И это единственный не пикантный ;-).   -  person dhke    schedule 20.06.2017


Ответы (1)


Вы можете использовать os.path.exists("schedule.dat"). Возвращает логический результат.

Альтернативное решение с использованием os.stat включает:

import os
try:
    os.stat("schedule.dat")
    ... # file exists
except:
    file = open("schedule.dat", "w")
    ...

Возникает исключение, если вы пытаетесь stat несуществующий файл.

person cs95    schedule 19.06.2017
comment
Спасибо вам всем. Моя проблема заключалась в том, что schedule.ready () должен был быть file.read (). Глупая ошибка с моей стороны. Спасибо jacoblaw, и я изучу этот Chiheb Nexus и coldpeed как альтернативный способ сделать это. - person Nathan Rigg; 20.06.2017