Skip to content
This is my space, where experience meets the will to start over. This is my space, where experience meets the will to start over.

The first step is knowing where you want to go.

  • Home
  • Coding Hub
    • Software & Project
      • Small Biz Ops – S.B.O.
        • SmallBizOps – Day 10/90
      • CRM/ERP
      • MyTracker
      • My Budget
    • Form Zero to “WoW”
      • JavaScript from Zero (Completed)
        • 2. Remove and Edit List Items
        • 3. Separate HTML and JavaScript, Use addEventListener and Conditional Logic
        • 4. Add Dynamic CSS Classes
        • 5. Save & Restore Your List with localStorage
        • 6 – Turn Your App into a Full To-Do List
      • Python from Zero (Completed)
        • 2. Lists & Loops
        • 3. Conditional Menus
        • 4. Edit & Remove Tasks (with closing: Python vs PHP and Large Data)
        • 5 – Save to File: Make Your Tasks Survive Restarts
        • 6 — Pythin from zero – Final Project Polishing: Numbering, Formatting, and Preparing for CSV
      • Rust – From Zero to “WoW” (Completed)
        • 1 – Setup and Project Structure in Rust
        • 2 – User input: validation and error handling
        • 3 – Rust from Zero to “WoW – BMI Calculation and Conditional Logic
        • 4 –Rust – Clear, Formatted Output
        • 5 – Rust – Final Thoughts: Precision as a Form of Respect
      • Go from Zero to “WoW” (Completed)
        • 1 – Why Go Is Perfect for a Personal Expense Tracker
        • 2 – Logging Expenses and Console Input
        • 3 – Go from Zero to “WoW” – Smart Filtering & Display Logic
        • 4 – Go – Saving Data to Local Files
        • 5 – Go – Final Project – Expense Tracker in Go
      • C++ from Zero to “WoW” (Completed)
        • 1 – Why C++ for file organization?
        • 2 – C++ – File Type Detection and Classification
        • 3 – C++ – Creating & Managing Subfolders
        • 4 – C++ – Safe File Movement and User Feedback
        • 5 – C++ – Order as Mental Clarity
      • Ubuntu – From Zero to “WoW” (Completed)
        • 2 – Ubuntu – The Desktop Environment and Essential Commands
        • 3 – Ubuntu – Managing Files, Folders, and Permissions
        • 4 – Ubuntu – Installing and Updating Software with APT and Snap
        • 5 – Ubuntu – Customizing the Desktop Environment
        • 6 – Ubuntu – Network and Device Configuration
        • 7 – Ubuntu – User Management & System Security — “The Cathedral of Permissions”
        • 8 – Ubuntu – The Talking Machine: Terminal & Bash Scripting
        • 9 – Ubuntu – Ubuntu as a Server or Development Environment
        • 10 – Ubuntu – Backup, Maintenance & Troubleshooting
    • Git Hub Repository
      • Small Biz Ops – S.B.O.
      • Mini ERP – PHP & MySQL
      • CleverCRM (Java, Spring Boot)
      • FraudWatch (Python, FastAPI + scikit-learn)
      • OnboardIQ – Smart Onboarding Portal (Flask + SQLite Demo)
    • ArchPilot
      • 1-Users & Roles, End-to-End (Architecture, Database, and Cross-Framework Code)
      • 2 – Client Registry (CRM) Across Frameworks
      • 3 – Project & Budget Tracker (ERP)
      • 4 – Approval Workflow Engine Multi-step routing, status tracking, escalation paths
      • 5 – Audit Trail & Versioning
    • Small Biz Ops – S.B.O.
  • Vivere in USA
  • P4Y
  • Testi poetici
    • 1 – Sospeso
    • 2 – Il bicchiere di vetro quieto
    • 3 – Quando l’amore inciampa
    • 4 – Ma chi siete davvero?
    • 5 – Above the Thread of Day
    • 6 – The Truth That Doesn’t Exist
    • 7 – All of You, I Miss
    • 8 – The Captain and the Ocean
    • 9 – Between Light and Mist
    • 10 – Il peso delle scelte
  • Contact
  • Admin
This is my space, where experience meets the will to start over.
This is my space, where experience meets the will to start over.

The first step is knowing where you want to go.

Coding – Step 10.6 — Pythin from zero – Final Project Polishing: Numbering, Formatting, and Preparing for CSV

Posted on 23 Agosto 202523 Agosto 2025 By Francesco

In the final lesson of our Python from Zero course, we polish the To-Do App: adding numbered output, better formatting, and preparing the ground for CSV import/export.

Congratulations! You’ve reached the final step of the Python from Zero series 🎉. So far, our To-Do App can add, edit, remove, and persist tasks in a .txt file. In this lesson we’ll do some final polishing:

  • Add task numbering in the display.
  • Improve formatting for better readability.
  • Set up the code so it’s easier to switch to CSV import/export later.

1) Numbering and Formatting

Our previous printout was simple. Let’s add numbering and a header line for clarity:

def print_tasks(tasks):
    if not tasks:
        print("\\n[No tasks yet]\\n")
        return
    print("\\n=== Current To-Do List ===")
    for i, t in enumerate(tasks, start=1):
        print(f"{i:2d}. {t}")
    print("===========================")

This gives output like:


=== Current To-Do List ===
 1. Buy milk
 2. Finish project
 3. Read a book
===========================

2) Preparing for CSV

Right now we save tasks as plain text. To move toward CSV (comma-separated values), we can define a task as a small dictionary or tuple. For example:

import csv

def save_tasks_csv(tasks, filename="tasks.csv"):
    with open(filename, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        for task in tasks:
            writer.writerow([task])

def load_tasks_csv(filename="tasks.csv"):
    tasks = []
    try:
        with open(filename, "r", newline="", encoding="utf-8") as f:
            reader = csv.reader(f)
            for row in reader:
                if row:
                    tasks.append(row[0])
    except FileNotFoundError:
        pass
    return tasks

Even though we’re still using simple strings, this structure makes it easy to expand later (e.g., add columns for status, priority, or due date).

3) Final Polished To-Do App

from typing import List
import csv

FILENAME = "tasks.csv"


# ---------- Persistence Layer (CSV-ready) ----------
def load_tasks(filename: str = FILENAME) -> List[str]:
    tasks: List[str] = []
    try:
        with open(filename, "r", newline="", encoding="utf-8") as f:
            reader = csv.reader(f)
            for row in reader:
                if row:
                    tasks.append(row[0])
    except FileNotFoundError:
        pass
    return tasks


def save_tasks(tasks: List[str], filename: str = FILENAME) -> None:
    with open(filename, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        for task in tasks:
            writer.writerow([task])


# ---------- Helpers ----------
def print_tasks(tasks: List[str]) -> None:
    if not tasks:
        print("\\n[No tasks yet]\\n")
        return
    print("\\n=== Current To-Do List ===")
    for i, t in enumerate(tasks, start=1):
        print(f"{i:2d}. {t}")
    print("===========================")


def add_task(tasks: List[str]) -> None:
    new_task = input("Enter new task: ").strip()
    if not new_task:
        print("Empty task not added.")
        return
    tasks.append(new_task)
    save_tasks(tasks)
    print("Task added and saved.")


def remove_task(tasks: List[str]) -> None:
    print_tasks(tasks)
    if not tasks:
        return
    idx_str = input("Enter the task number to remove: ").strip()
    if not idx_str.isdigit():
        print("Please enter a valid number.")
        return
    idx = int(idx_str)
    if 1 <= idx <= len(tasks):
        removed = tasks.pop(idx - 1)
        save_tasks(tasks)
        print(f"Removed: '{removed}' (saved).")
    else:
        print("Invalid task number.")


# ---------- CLI ----------
def main() -> None:
    print("=== Step 10.7 — Final Project Polishing ===")
    tasks = load_tasks()
    print(f"Loaded {len(tasks)} task(s).")
    while True:
        print_tasks(tasks)
        print("Choose an action:")
        print("[a] Add  [r] Remove  [q] Quit")
        choice = input("> ").strip().lower()

        if choice == "a":
            add_task(tasks)
        elif choice == "r":
            remove_task(tasks)
        elif choice == "q":
            save_tasks(tasks)
            print("Tasks saved. Goodbye!")
            break
        else:
            print("Unknown option. Please choose a, r, or q.")


if __name__ == "__main__":
    main()

4) Wrap-Up

With these final touches, our To-Do App is:

  • Readable — numbered and formatted task list.
  • Persistent — tasks are saved between sessions.
  • Extensible — ready for CSV, JSON, or even databases.

This concludes the Python from Zero journey 🚀. You now have the foundations to move on to larger projects: from simple command-line tools to structured applications.

Homework:

  1. Extend the CSV format to include a second column (e.g., task status: “done”/”pending”).
  2. Format the output so completed tasks show a checkmark ✓.
  3. Experiment with JSON saving instead of CSV.
  4. Think of one personal project where you could apply this structure.

Post Views: 360

Condividi:

  • Condividi su Facebook (Si apre in una nuova finestra) Facebook
  • Condividi su X (Si apre in una nuova finestra) X
Coding Python CSVData PersistenceFile HandlingFinal ProjectLearn to CodeProgramming BasicsPythonPython TutorialTo-Do App

Navigazione articoli

Previous post
Next post

Francesco

My name is Francesco Boschi, originally from Italy and currently based in the United States. For over twenty years, I’ve worked as a manager and consultant across diverse sectors — from education and cultural institutions to the food industry — developing skills in operational management, strategic consulting, and complex problem-solving. In recent years, I’ve combined this experience with a strong passion for software development, creating custom tools designed to simplify workflows and meet real business needs.

Relocating to the U.S. marks the beginning of a new chapter: a personal and professional decision driven by the desire to be close to my son and to embrace new challenges in a different environment. Today, my goal is to turn my experience into meaningful solutions, blending strategic vision with technical expertise to help people and organizations work more effectively.

I enjoy moving between different worlds, adapting tools and approaches to people and contexts. I bring leadership, flexibility, attention to detail, analytical thinking, and a strong problem-solving mindset — along with a deep curiosity to learn and grow. Above all, I believe in sharing: I’m always eager to offer my experience to support the growth of others.

Related Posts

Coding

Coding – Step 12.5 – GO – Final Project – Expense Tracker in Go

Posted on 18 Ottobre 202518 Ottobre 2025

Simple expense tracker in Go with local file saving, CSV/JSON support, and trust-through-clarity design.

Condividi:

  • Condividi su Facebook (Si apre in una nuova finestra) Facebook
  • Condividi su X (Si apre in una nuova finestra) X
Read More
Coding

Coding – Step 11.1 – Rust from Zero to “WoW” – Setup and Project Structure in Rust

Posted on 8 Settembre 20258 Settembre 2025

Learn how to set up your Rust development environment from scratch and build the foundation for a precise, elegant BMI calculator. This chapter blends philosophy and practice to show how even simple tools deserve thoughtful design.

Condividi:

  • Condividi su Facebook (Si apre in una nuova finestra) Facebook
  • Condividi su X (Si apre in una nuova finestra) X
Read More
Coding

Coding – Step 11 – Rust – From Zero to “WoW”

Posted on 5 Settembre 202527 Settembre 2025

A minimalist yet powerful console app built in Rust that calculates Body Mass Index (BMI) with strict input validation and clean output. Designed to show how precision and safety can elevate even the simplest health tool into something trustworthy and refined.

Condividi:

  • Condividi su Facebook (Si apre in una nuova finestra) Facebook
  • Condividi su X (Si apre in una nuova finestra) X
Read More

Iscriviti alla nostra Newsletter

🤞 Let's keep in touch

We do not send spam! Read our Privacy policy for more information.

Controlla la tua casella di posta o la cartella spam per confermare la tua iscrizione

Cerca nel sito

©2026 This is my space, where experience meets the will to start over. | WordPress Theme by SuperbThemes