Я пытаюсь записать в файл данные чтобы они были действительны при повтроном запуске программы но вылазеет ошибка Ошибка при записи в файл: [Errno 9] Bad file descriptor
Traceback (most recent call last):
File "D:\Взлом\Умный дом\real_time_object_detection.py", line 209, in
check_events() # Проверка на срабатывание будильников и напоминаний
File "D:\Взлом\Умный дом\real_time_object_detection.py", line 82, in check_events
data = load_data() # Загружаем данные из файла
File "D:\Взлом\Умный дом\real_time_object_detection.py", line 63, in load_data
return json.load(f)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 293, in load
return loads(fp.read(),
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
import speech_recognition as sr
import pyttsx3
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta
import time
import sys
import os
import json
def shutdown_PC():
os.system("shutdown /s /t 1")
# Инициализация синтезатора речи
engine = pyttsx3.init()
# Функция для озвучивания текста
def talk(words):
engine.say(words)
engine.runAndWait()
# Функция для получения погоды
def get_weather():
url = "https://yandex.ru/pogoda/ru-RU/details/today?lat=54.921256&lon=82.991208&lang=ru&via=ms"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
weather_block = soup.find('div', class_='temp fact__temp')
if weather_block:
temperature = weather_block.text.strip()
else:
temperature = "неизвестно"
condition_block = soup.find('div', class_='link__condition day-anchor i-bem')
if condition_block:
condition = condition_block.text.strip()
else:
condition = "неизвестно"
return f"Температура {temperature}, состояние: {condition}"
# Функция для распознавания речи
def command():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Говорите")
r.pause_threshold = 1
r.adjust_for_ambient_noise(source, duration=1)
audio = r.listen(source)
try:
zadanie = r.recognize_google(audio, language="ru-RU").lower()
print("Вы сказали: " + zadanie)
except sr.UnknownValueError:
zadanie = command()
return zadanie
# Загрузка данных из файла
def load_data():
try:
with open("reminders.json", "r", encoding="utf-8") as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return {"alarms": [], "reminders": []} # Возвращаем пустую структуру, если файл не найден или поврежден
# Сохранение данных в файл
def save_data(data):
try:
print("Открываем файл для записи...")
with open("reminders.json", "w", encoding="utf-8") as f:
print("Файл открыт. Пытаемся записать данные...")
json.dump(data, f, ensure_ascii=False, indent=4)
print("Данные успешно записаны.")
except OSError as e:
print(f"Ошибка при записи в файл: {e}")
except Exception as e:
print(f"Другая ошибка при записи в файл: {e}")
finally:
print("Процесс записи завершён.")
# Проверка и запуск будильников и напоминаний
def check_events():
data = load_data() # Загружаем данные из файла
# Логика проверки будильников и напоминаний
now = datetime.now()
# Проверка будильников
for alarm in data["alarms"]:
alarm_time = datetime.strptime(alarm["time"], "%Y-%m-%d %H:%M")
if now >= alarm_time:
talk("Будильник сработал!")
# Удаляем будильник после срабатывания
data["alarms"].remove(alarm)
# Проверка напоминаний
for reminder in data["reminders"]:
reminder_time = datetime.strptime(reminder["time"], "%Y-%m-%d %H:%M")
if now >= reminder_time:
talk(f"Напоминание: {reminder['message']}")
# Удаляем напоминание после срабатывания
data["reminders"].remove(reminder)
save_data(data) # Сохраняем обновленные данные
# Функция для установки будильника на сегодня
def set_alarm_today(hour, minute):
now = datetime.now()
alarm_time = now.replace(hour=hour, minute=minute, second=0, microsecond=0)
if now > alarm_time:
talk("Выбранное время уже прошло!")
else:
talk(f"Будильник установлен на {hour:02}:{minute:02} сегодня.")
data = load_data()
data["alarms"].append({"time": alarm_time.strftime("%Y-%m-%d %H:%M"), "message": "Время вставать!"})
save_data(data)
# Функция для установки будильника на конкретный день недели
def set_alarm_day_of_week(day, hour, minute):
days_of_week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
if day not in days_of_week:
talk(f"Неверный день недели. Выберите из: {', '.join(days_of_week)}")
return
day_diff = (days_of_week.index(day) - datetime.now().weekday()) % 7
alarm_time = datetime.now().replace(hour=hour, minute=minute, second=0, microsecond=0) + timedelta(days=day_diff)
talk(f"Будильник установлен на {day.capitalize()} в {hour:02}:{minute:02}.")
data = load_data()
data["alarms"].append({"time": alarm_time.strftime("%Y-%m-%d %H:%M"), "message": f"Будильник на {day}."})
save_data(data)
# Функция для установки напоминания
def set_reminder():
talk("На какую дату вы хотите установить напоминание? Скажите в формате день, месяц, год.")
date_input = command()
try:
reminder_date = datetime.strptime(date_input, "%d %B %Y")
except ValueError:
talk("Неверный формат даты. Попробуйте еще раз.")
return
talk("На какое время установить напоминание? Скажите час.")
hour = recognize_numbers()
talk("Скажите минуты.")
minute = recognize_numbers()
talk("Какое сообщение нужно напомнить?")
reminder_message = command()
reminder_time = reminder_date.replace(hour=hour, minute=minute, second=0, microsecond=0)
now = datetime.now()
if reminder_time <= now:
talk("Выбранное время уже прошло!")
else:
talk(f"Напоминание установлено на {reminder_date.strftime('%d %B %Y')} в {hour:02}:{minute:02}.")
data = load_data()
data["reminders"].append({"time": reminder_time.strftime("%Y-%m-%d %H:%M"), "message": reminder_message})
save_data(data)
# Функция для распознавания чисел (время)
def recognize_numbers():
while True:
try:
num = command()
return int(num)
except ValueError:
talk("Пожалуйста, скажите число.")
# Функция для обработки задания
def makeSomething(zadanie):
if 'будильник' in zadanie:
set_alarm_by_voice()
elif 'напоминание' in zadanie:
set_reminder()
elif 'стоп' in zadanie:
talk("До свидания!")
sys.exit()
elif 'выключить' in zadanie:
shutdown_PC()
# Функция для голосового ввода времени и дня недели
def set_alarm_by_voice():
talk("Хочу ли я установить будильник на сегодня или на всю неделю?")
response = command()
if 'сегодня' in response:
talk("На какое время установить будильник? Скажите час.")
hour = recognize_numbers()
talk("Скажите минуты.")
minute = recognize_numbers()
set_alarm_today(hour, minute)
elif 'неделю' in response:
talk("На какой день недели установить будильник?")
day = command()
talk("На какое время установить будильник? Скажите час.")
hour = recognize_numbers()
talk("Скажите минуты.")
minute = recognize_numbers()
set_alarm_day_of_week(day, hour, minute)
else:
talk("Я вас не поняла, попробуйте еще раз.")
# Основной цикл программы
while True:
check_events() # Проверка на срабатывание будильников и напоминаний
makeSomething(command())