example-projects/reference/python/10_file_io.py

150 lines
4.6 KiB
Python

# Lesson 10: File Input and Output
#
# Programs often need to read data from files and write results back.
# Python makes this straightforward with the built-in open() function.
#
# File modes:
# "r" — read (default). File must exist.
# "w" — write. Creates the file; OVERWRITES if it already exists.
# "a" — append. Creates the file; adds to the end if it already exists.
# "r+" — read and write.
#
# Always use the 'with' statement — it closes the file automatically,
# even if an error occurs.
#
# To run this file:
# python 10_file_io.py
import os
# ============================================================
# WRITING TO A FILE
# ============================================================
output_path = "sample_output.txt"
with open(output_path, "w") as f:
f.write("Line 1: Hello from Python!\n")
f.write("Line 2: Writing to files is easy.\n")
f.write("Line 3: The 'with' block closes the file for us.\n")
print(f"File written: {output_path}")
# ============================================================
# READING AN ENTIRE FILE AT ONCE
# ============================================================
with open(output_path, "r") as f:
contents = f.read()
print("\n--- Full file contents ---")
print(contents)
# ============================================================
# READING LINE BY LINE
# ============================================================
print("--- Reading line by line ---")
with open(output_path, "r") as f:
for line in f:
# line includes the trailing newline character, so strip it
print(repr(line.strip()))
# --- readlines() returns a list of all lines ---
with open(output_path, "r") as f:
lines = f.readlines()
print(f"\nNumber of lines: {len(lines)}")
print(f"First line: {lines[0].strip()}")
# ============================================================
# APPENDING TO A FILE
# ============================================================
with open(output_path, "a") as f:
f.write("Line 4: Appended after the original content.\n")
with open(output_path, "r") as f:
print("\n--- After appending ---")
print(f.read())
# ============================================================
# WRITING MULTIPLE LINES WITH writelines()
# ============================================================
shopping_list = ["eggs\n", "milk\n", "bread\n", "butter\n"]
with open("shopping.txt", "w") as f:
f.writelines(shopping_list)
print("shopping.txt created.")
# ============================================================
# WORKING WITH CSV-STYLE DATA
# ============================================================
# CSV (comma-separated values) is a common plain-text format for tables.
# Python's csv module handles quoting and edge cases automatically.
import csv
students = [
{"name": "Alice", "grade": "A", "score": 95},
{"name": "Bob", "grade": "B", "score": 83},
{"name": "Carol", "grade": "A", "score": 91},
]
csv_path = "students.csv"
# Write CSV
with open(csv_path, "w", newline="") as f:
fieldnames = ["name", "grade", "score"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(students)
print(f"\n{csv_path} written.")
# Read CSV
print("\n--- Reading students.csv ---")
with open(csv_path, "r") as f:
reader = csv.DictReader(f)
for row in reader:
print(f" {row['name']}: {row['grade']} ({row['score']})")
# ============================================================
# CHECKING IF A FILE EXISTS
# ============================================================
print(f"\nDoes '{output_path}' exist? {os.path.exists(output_path)}")
print(f"Does 'missing.txt' exist? {os.path.exists('missing.txt')}")
# ============================================================
# SAFE READING WITH ERROR HANDLING
# ============================================================
def read_file_safe(path):
try:
with open(path, "r") as f:
return f.read()
except FileNotFoundError:
print(f"File not found: {path}")
return None
content = read_file_safe("missing.txt")
if content is None:
print("Could not read file — skipping.")
# ============================================================
# CLEANUP: remove the files we created
# ============================================================
for filename in [output_path, "shopping.txt", csv_path]:
if os.path.exists(filename):
os.remove(filename)
print(f"Removed: {filename}")
# --- Try it yourself ---
# 1. Write a program that asks the user to enter their name and favorite color,
# then saves those to a file called "profile.txt".
# 2. Read the file back and print a greeting using the saved information.