# CSV Files: Structured Data in Plain Text
# reader, DictReader, writer, DictWriter — all patterns in one place
# place soldiers.csv in the same folder as this script
# redhorndev.com

import csv

# ─────────────────────────────────────────────
# csv.reader — rows as lists
# ─────────────────────────────────────────────

with open("soldiers.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

# ['name', 'score', 'active']
# ['Raven', '85', 'True']
# ['Wolf', '74', 'False']
# ...

# ─────────────────────────────────────────────
# Skip header — next()
# ─────────────────────────────────────────────

with open("soldiers.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    next(reader)                        # skip header row
    for row in reader:
        name, score, active = row
        print(f"{name}: {int(score)}")  # convert score to int

# Raven: 85
# Wolf: 74
# Ghost: 91
# ...

# ─────────────────────────────────────────────
# csv.DictReader — rows as dicts
# ─────────────────────────────────────────────

with open("soldiers.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['name']}: {row['score']}")

# Raven: 85
# Wolf: 74
# ...

# build a list of dicts from CSV
soldiers = []
with open("soldiers.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        soldiers.append({
            "name":   row["name"],
            "score":  int(row["score"]),
            "active": row["active"] == "True"   # convert string to bool
        })

print(soldiers)
# [{'name': 'Raven', 'score': 85, 'active': True}, ...]

# ─────────────────────────────────────────────
# csv.writer — write lists as rows
# ─────────────────────────────────────────────

rows = [
    ["name", "score", "active"],
    ["Raven", 85, True],
    ["Wolf",  74, False],
    ["Ghost", 91, True]
]

with open("output.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(rows)      # write all rows at once

# writerow() for one row at a time
with open("output.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["name", "score", "active"])    # header
    writer.writerow(["Raven", 85, True])            # one row

# ─────────────────────────────────────────────
# csv.DictWriter — write dicts as rows
# ─────────────────────────────────────────────

soldiers = [
    {"name": "Raven", "score": 85, "active": True},
    {"name": "Wolf",  "score": 74, "active": False},
    {"name": "Ghost", "score": 91, "active": True}
]

with open("output.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "score", "active"])
    writer.writeheader()        # writes header row automatically
    writer.writerows(soldiers)

# ─────────────────────────────────────────────
# Quick reference
# ─────────────────────────────────────────────

# import csv
#
# csv.reader(f)                     — rows as lists
# csv.DictReader(f)                 — rows as dicts (uses header)
# next(reader)                      — skip one row (header)
# csv.writer(f)                     — write lists as rows
# csv.DictWriter(f, fieldnames=[])  — write dicts as rows
# writer.writerow(row)              — write one row
# writer.writerows(rows)            — write multiple rows
# writer.writeheader()              — write header (DictWriter only)
#
# all CSV values are strings — convert with int(), float(), bool()
# always pass newline="" when writing CSV
# use DictReader/DictWriter when file has headers
