В этом руководстве мы разоберём, как построить простое консольное приложение для управления задачами на Python. Пример основан на надёжной базовой структуре: хранение задач в JSON-файле, аккуратные функции для загрузки и сохранения данных, а также удобное меню для взаимодействия с пользователем. Ниже приведён рабочий пример кода, который реализует функционал, описанный выше. Комментарии поясняют ключевые моменты. import os
import json
FILENAME = "task.json"
def load_or_init():
"""Загружаем задачи или инициализируем файл пустым списком."""
if not os.path.exists(FILENAME):
with open(FILENAME, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=2)
with open(FILENAME, "r", encoding="utf-8") as f:
try:
data = json.load(f)
if isinstance(data, list):
return data
else:
return []
except json.JSONDecodeError:
return []
def save(tasks):
"""Сох
В этом руководстве мы разоберём, как построить простое консольное приложение для управления задачами на Python. Пример основан на надёжной базовой структуре: хранение задач в JSON-файле, аккуратные функции для загрузки и сохранения данных, а также удобное меню для взаимодействия с пользователем. Ниже приведён рабочий пример кода, который реализует функционал, описанный выше. Комментарии поясняют ключевые моменты. import os
import json
FILENAME = "task.json"
def load_or_init():
"""Загружаем задачи или инициализируем файл пустым списком."""
if not os.path.exists(FILENAME):
with open(FILENAME, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=2)
with open(FILENAME, "r", encoding="utf-8") as f:
try:
data = json.load(f)
if isinstance(data, list):
return data
else:
return []
except json.JSONDecodeError:
return []
def save(tasks):
"""Сох
...Читать далее
В этом руководстве мы разоберём, как построить простое консольное приложение для управления задачами на Python. Пример основан на надёжной базовой структуре: хранение задач в JSON-файле, аккуратные функции для загрузки и сохранения данных, а также удобное меню для взаимодействия с пользователем.
Что мы будем создавать
- Простое приложение командной строки.
- Хранение задач в JSON-файле (task.json).
- Возможности:Вывод списка задач с состоянием.
Добавление новой задачи.
Удаление задачи.
Изменение статуса задачи.
Безопасная работа с файл-операциями и обработка ошибок.
Архитектура и принципы
- Разделение кода на функции:загрузка и инициализация данных
сохранение данных
отображение задач
добавление, удаление и изменение статуса задач - Единый источник правды: файл task.json.
- Чистый формат данных: список словарей, где каждая задача имеет поля:Name: строка с названием зада
FAL: логическ - Надёжная обработка ошибок: безопасная загрузка JSON, проверка типов.
Подготовка окружения
- Убедитесь, что у вас установлен Python 3.x.
- Рекомендуется работать в виртуальном окружении.
Основной код
Ниже приведён рабочий пример кода, который реализует функционал, описанный выше. Комментарии поясняют ключевые моменты.
import os
import json
FILENAME = "task.json"
def load_or_init():
"""Загружаем задачи или инициализируем файл пустым списком."""
if not os.path.exists(FILENAME):
with open(FILENAME, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=2)
with open(FILENAME, "r", encoding="utf-8") as f:
try:
data = json.load(f)
if isinstance(data, list):
return data
else:
return []
except json.JSONDecodeError:
return []
def save(tasks):
"""Сохраняем текущий список задач в файл."""
with open(FILENAME, "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=2)
def show_tasks(tasks):
"""Выводим список задач с текущим статусом."""
if not tasks:
print("Список задач пуст.")
return
for idx, t in enumerate(tasks, start=1):
name = t.get("name", "")
fal = t.get("fal", False)
status = "Готово" if fal else "В работе"
print(f"{idx}. {name} – {status}")
def add_task(tasks):
"""Добавление новой задачи."""
name = input("Введите название задачи: ").strip()
if name:
if not isinstance(tasks, list):
tasks = []
tasks.append({"name": name, "fal": False})
print("Задача добавлена.")
else:
print("Название не может быть пустым.")
def delete_task(tasks):
"""Удаление задачи по номеру."""
show_tasks(tasks)
if not tasks:
return
try:
idx = int(input("Удалить задачу под номером: ").strip())
if 1 <= idx <= len(tasks):
removed = tasks.pop(idx-1)
print(f"Удалена задача: {removed.get('name','')}")
else:
print("Некорректный номер.")
except ValueError:
print("Введите число.")
def toggle_task_status(tasks):
"""Переключение статуса задачи на выполнено/не выполнено."""
show_tasks(tasks)
if not tasks:
return
try:
idx = int(input("Отметить как выполненную задачу №: ").strip())
if 1 <= idx <= len(tasks):
tasks[idx-1]["fal"] = not tasks[idx-1].get("fal", False)
print("Статус обновлен.")
else:
print("Некорректный номер.")
except ValueError:
print("Введите число.")
def main():
tasks = load_or_init()
while True:
print("Выбери действие:\n 1: Вывести список\n 2: Добавить новую задачу\n 3: Удалить задачу\n 4: Изменить статус задачи\n 5: Закрыть программу")
choice = input().strip()
if choice == "1":
show_tasks(tasks)
elif choice == "2":
add_task(tasks)
save(tasks)
elif choice == "3":
delete_task(tasks)
save(tasks)
elif choice == "4":
toggle_task_status(tasks)
save(tasks)
elif choice == "5":
break
else:
print("Неправильный выбор. Попробуйте снова.")
if __name__ == "__main__":
main()
Как работает приложение
- При первом запуске создаётся файл task.json, если он отсутствует, и инициализируется пустым списком.
- Загрузка данных выполняется в функции load_or_init(), которая возвращает список с
- Все изменения (добавление, удаление, смена статуса) сохраняются в файл через функцию save().
- Пользователь видит меню и может выбирать действие по номеру.
Примеры использования
- Вывести список: программа распечатает существующие задачи и их статусы.
- Добавить задачу: после ввода названия задача добавляется в конец списка и файл обновляется.
- Удалить задачу: пользователь видит список и вводит номер задачи для удаления.
- Изменить статус: выбранная задача может быть помечена как выполненная или наоборот.
Возможные улучшения
- Поддержка приоритета задач или дат выполнения.
- Поиск и фильтрация задач по статусу или ключевым словам.
- Экспорт/импорт задач в другие форматы (CSV, YAML).
- Логирование действий пользователя для аудита.
- Добавление тестов unit-тестов для ключевых функций.
Советы по расширению
- Если планируете многопользовательский доступ или хранение задач на сервере, можно заменить JSON на базу данных (SQLite, PostgreSQL) и добавить слой ORM.
- Для более удобного взаимодействия можно перейти к графическому интерфейсу (Tkinter, PyQt) или к веб-интерфейсу (Flask/FastAPI).
Если хотите, могу адаптировать статью под ваш стиль или добавить разделы, например, “Чек-лист для релиза” или “Частые ошибки и как их избежать”.