【发布时间】:2017-11-22 05:14:23
【问题描述】:
我尝试了 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()
【问题讨论】:
-
我认为
schedule = schedule.read()应该是schedule = file.read() -
当您说打开文件并且不再写入时,您的意思是您正在尝试将数据附加到文件末尾?还是什么都不做?如果要附加数据,可以使用
a标志而不是w并检查文件是否存在。 -
请注意,从 dup 参考中的答案中,
open(..., 'x')的答案可能是您想要的答案。当要打开的文件已经存在时,这会导致open()与FileExistsError一起发出嘶嘶声。而且它是唯一不活泼的 ;-)。
标签: python python-3.x raspberry-pi raspberry-pi3