✦ Srednji nivo Pythona i OOP Završni projekat Levela 2

L2 · Koncept 03 · Završni projekat: Task Manager

Sačuvaj zadatke
I nakon završetka programa.

Sačuvaj podatke Task Managera kao JSON kako bi bili dostupni pri sledećem pokretanju programa.

Cilj učenjaSačuvaj Task podatke kao JSON i ponovo napravi Task objekte bez dupliranja liste menadžera.
01 Uči02 Radi lokalno03 Proveri razumevanje

Učenje kao gost

Učiš kao gost — sačuvaj svoj napredak!

Napravi besplatan nalog i uči uz Sloby AI mentora, proveru razumevanja i praćenje napretka.

Cela platforma je besplatna tokom 2026. Foundations ostaje zauvek besplatan.

Memorija nestaje; fajlovi ostaju.

Lista TaskManagera postoji samo dok program radi. JSON je poznat format strukturiranog teksta: json.dump() zapisuje Python liste i rečnike u fajl, dok ih json.load() ponovo čita.

import json

def save_tasks(self, path="data/tasks.json"):
    data = {"task_id": task.task_id, "title": task.title, "completed": task.completed}
    with open(path, "w", encoding="utf-8") as file:
        json.dump([data], file, ensure_ascii=False, indent=2)

JSON ne može direktno da sačuva prilagođeni Task objekat. Sačuvaj rečnik sa task_id, title i completed, a nakon učitavanja napravi novi Task iz tog rečnika.

save_tasks(path="data/tasks.json") i load_tasks(path="data/tasks.json") koriste podrazumevanu putanju u normalnom radu. U testu prosledi posebnu putanju kako test podaci nikada ne bi menjali stvarni data/tasks.json fajl. Uspešno učitavanje zamenjuje self.tasks, umesto da ga dopunjuje, pa ponovljeno učitavanje ne pravi duplikate.

↳

Jasna politika rada sa fajlom: Ako izabrana putanja ne postoji, load_tasks() ostavlja trenutnu listu nepromenjenom. Ako JSON nije ispravan, prijavi čitljivu grešku i zadrži trenutnu listu nepromenjenom.

Ponovno pravljenje jednog Task objekta
saved = {"task_id": "task-1", "title": "Read", "completed": True}
task = Task(saved["task_id"], saved["title"])
task.completed = saved["completed"]

Rečnik sadrži obične JSON vrednosti. Ponovo napravljen Task je opet objekat sa atributima i metodama.

Čuvaj i učitavaj predvidivo

  1. Sačuvaj obične podatkePretvori svaki Task u rečnik, zatim upotrebi json.dump() sa encoding="utf-8".
  2. Učitaj novu listuUčitaj JSON pomoću json.load(), ponovo napravi Task objekte i zameni self.tasks tek nakon uspešnog učitavanja.

Česte greške pri JSON čuvanju podataka

  • Pokušaj direktnog čuvanja Task objektajson.dump() prihvata rečnike, liste, stringove, brojeve, logičke vrednosti i null-slične vrednosti, a ne prilagođene objekte.

Sačuvaj zadatke i nakon završetka programa

Radi ovo u VS Code-u

Nastavi u Task Manager projektu iz koncepata 28 i 29. U ovaj isti projekat ćeš dodati JSON čuvanje podataka, bez pravljenja ili preuzimanja novog projekta.

Tvoj postojeći Task Manager projekat
task_manager/
├── main.py
├── models/
│   └── task.py
├── services/
│   └── task_manager.py
└── data/
    └── tasks.json

Zadrži Task i TaskManager metode koje si već napravio. Folder data čuvaće JSON fajl koji pravi tvoj program.

Dodaj čuvanje podataka korak po korak

  1. Otvori postojeći projekatOtvori isti folder projekta u VS Code-u. Najviše ćeš raditi u models/task.py, services/task_manager.py, main.py i folderu data.
  2. Prepoznaj oblik JSON-aJedan Task objekat postaje jedan rečnik. JSON fajl čuva listu tih rečnika, a ne Python Task objekte.
  3. Isplaniraj pretvaranje objekataZapiši tri vrednosti koje svaki sačuvani zadatak treba: task_id, title i completed. Zatim odluči kako ćeš napraviti novi Task i vratiti njegovu vrednost completed nakon čitanja rečnika.
    task_data = {
        "task_id": task.task_id,
        "title": task.title,
        "completed": task.completed,
    }
  4. Implementiraj save_tasks()U services/task_manager.py uvezi json i dodaj opcioni path parametar sa podrazumevanom vrednošću "data/tasks.json". Pretvori trenutnu listu u obične rečnike, zatim je uz UTF-8 kodiranje zapiši na path. Poziv save_tasks() koristi uobičajeni fajl projekta; test može proslediti posebnu putanju.
    def save_tasks(self, path="data/tasks.json"):
        with open(path, "w", encoding="utf-8") as file:
            json.dump(tasks_data, file, ensure_ascii=False, indent=2)
  5. Bezbedno implementiraj load_tasks()Daj load_tasks() isti opcioni path parametar. Pročitaj tu putanju, ponovo napravi Task objekte u novoj listi i dodeli self.tasks tek kada čitanje i rekonstrukcija uspeju. Ako izabrani fajl ne postoji, ostavi trenutnu listu nepromenjenom. Ako JSON nije ispravan, prikaži čitljivu grešku i zadrži trenutnu listu.
    def load_tasks(self, path="data/tasks.json"):
        with open(path, encoding="utf-8") as file:
            saved_tasks = json.load(file)
  6. Pokaži kompletno čuvanje i učitavanjeU main.py dodaj dva zadatka, sačuvaj ih, pregledaj napravljeni JSON fajl, zatim ponovo pokreni program i učitaj sačuvane zadatke pre njihovog prikaza.
    python3 main.py
    # or: python main.py
Primer JSON fajla
[
  {"task_id": "task-1", "title": "Read the plan", "completed": false},
  {"task_id": "task-2", "title": "Write notes", "completed": true}
]

JSON koristi obične vrednosti. Rečnik opisuje podatke zadatka, a tvoj Python kod ponovo pravi Task objekat nakon učitavanja.

↳

Ručna provera: add two tasks → save_tasks() → inspect data/tasks.json → restart → load_tasks() → list_tasks() Nakon ponovnog pokretanja, dva sačuvana zadatka treba da se pojave samo jednom. Odvojeno testiraj fajl koji nedostaje i neispravan JSON, bez gubitka zadataka koji su već u memoriji.

Pre nego što zatražiš pomoć od Slobyja

  • Proveri putanju do JSON fajlaPokreni main.py iz foldera projekta kako bi relativna putanja data/tasks.json pokazivala na očekivani folder data.
  • Ne čuvaj Task objekte direktnoTypeError znači da je json.dump() dobio Task objekat. Najpre pretvori svaki Task u rečnik.
  • Smireno obradi fajl koji nedostajeFileNotFoundError je normalan slučaj pri prvom pokretanju. Jasno ga objasni i ostavi trenutnu listu zadataka nepromenjenom.
  • Bezbedno obradi neispravan JSONUhvati JSONDecodeError, prijavi da fajl ne može da se pročita i ne zamenjuj self.tasks delimičnim podacima.
  • Izbegni dupliranje zadataka nakon učitavanjaNe dodaj učitane zadatke u self.tasks. Napravi novu listu i zameni self.tasks tek nakon uspešnog učitavanja.

Šta load_tasks() treba da uradi nakon uspešnog čitanja sačuvanog JSON-a?

Izaberi ponašanje koje sprečava dupliranje zadataka pri ponovljenom učitavanju.

manager.tasks = loaded_tasks
Izaberi izlaz

Izgrađuj samopouzdanje samostalnim radom

Dokaži da učitavanje zamenjuje listu

Testiraj čuvanje podataka, a ne samo kopiranje primera. Iskoristi zadatak koji je već u memoriji da pokažeš razliku između zamene i dodavanja u listu.

Vaš ciljSačuvaj dva zadatka. Pre učitavanja dodaj drugačiji privremeni Task samo u memoriju. Zatim učitaj sačuvani fajl i pokaži da je privremeni Task nestao, dok se dva sačuvana zadatka pojavljuju tačno jednom.
task_manager/
├── main.py
├── services/task_manager.py
└── data/tasks.json

Radi u svom lokalnom VS Code folderu

Nagoveštaji korak po korak
  • Koristi različite task_id vrednosti za dva sačuvana zadatka i privremeni Task.
  • Napravi novu listu za ponovo napravljene Task objekte, umesto da menjaš self.tasks tokom petlje.
  • Dodeli novu listu promenljivoj self.tasks tek nakon što json.load() i svaki korak rekonstrukcije uspeju.

Pitaj Slobyja jedno vodeće pitanje o pretvaranju objekata, putanjama fajlova ili bezbednom učitavanju. Nemoj tražiti da napiše gotove metode za čuvanje podataka umesto tebe.

Sloby, maskota Python AI Tutora

Tvoj mentor za učenje

Prijavite se da pitate Slobyja

Napravite besplatan nalog ili se prijavite za AI smernice tokom učenja.

Prijavite se da proverite svoje razumevanje

Napravite besplatan nalog ili se prijavite da biste dobili AI povratnu informaciju i sačuvali napredak u učenju.

Python AI Tutor · Uči razumevanjem, a ne samo pokretanjem koda.