@Fox1212

Не получается записать в файл?

Я пытаюсь записать в файл данные чтобы они были действительны при повтроном запуске программы но вылазеет ошибка Ошибка при записи в файл: [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())
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 1
@eminsk
программирую на python
Тебе функцию save_data лучше переделать в такой вид:
def save_data(data):
    try:
        with open("reminders.json", "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
    except IOError as e:
        print(f"Error writing to file: {e}")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы