Python Basics — Working with CSV Files

2 minute read

Working with CSV Files

CSV (Comma-Separated Values) is one of the most common data exchange formats. Python’s built-in csv module makes reading and writing CSV data straightforward.

Reading CSV Files

Basic Reader

import csv

with open("employees.csv", "r") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)  # Each row is a list of strings

Sample employees.csv:

name,department,salary
Alice,Engineering,95000
Bob,Marketing,72000
Carol,Engineering,98000

Output:

['name', 'department', 'salary']
['Alice', 'Engineering', '95000']
['Bob', 'Marketing', '72000']
['Carol', 'Engineering', '98000']

Skipping the Header

import csv

with open("employees.csv", "r") as f:
    reader = csv.reader(f)
    header = next(reader)  # Read and skip header
    print(f"Columns: {header}")
    
    for row in reader:
        name, dept, salary = row
        print(f"{name} earns ${int(salary):,}")

DictReader — Read as Dictionaries

DictReader maps each row to a dictionary using the header as keys:

import csv

with open("employees.csv", "r") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['name']} in {row['department']}: ${int(row['salary']):,}")

Output:

Alice in Engineering: $95,000
Bob in Marketing: $72,000
Carol in Engineering: $98,000

Custom Field Names

import csv

with open("data_no_header.csv", "r") as f:
    reader = csv.DictReader(f, fieldnames=["id", "product", "price"])
    for row in reader:
        print(row)

Writing CSV Files

Basic Writer

import csv

data = [
    ["name", "score", "grade"],
    ["Alice", 92, "A"],
    ["Bob", 78, "B"],
    ["Carol", 95, "A"],
]

with open("grades.csv", "w", newline="") as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

# Or write all rows at once:
with open("grades.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

Note: Always use newline="" when opening CSV files for writing to prevent blank rows on Windows.

DictWriter — Write from Dictionaries

import csv

employees = [
    {"name": "Alice", "department": "Engineering", "salary": 95000},
    {"name": "Bob", "department": "Marketing", "salary": 72000},
    {"name": "Carol", "department": "Engineering", "salary": 98000},
]

with open("employees_out.csv", "w", newline="") as f:
    fieldnames = ["name", "department", "salary"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    
    writer.writeheader()  # Write the header row
    writer.writerows(employees)

Handling Delimiters and Quoting

Custom Delimiters

import csv

# Tab-separated values
with open("data.tsv", "r") as f:
    reader = csv.reader(f, delimiter="\t")
    for row in reader:
        print(row)

# Pipe-separated
with open("data.psv", "r") as f:
    reader = csv.reader(f, delimiter="|")
    for row in reader:
        print(row)

Quoting Options

import csv

data = [
    ["name", "bio"],
    ["Alice", 'She said, "Hello!"'],
    ["Bob", "Line 1\nLine 2"],
]

# QUOTE_ALL — quotes every field
with open("quoted.csv", "w", newline="") as f:
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerows(data)

# QUOTE_MINIMAL (default) — quotes only when necessary
# QUOTE_NONNUMERIC — quotes all non-numeric fields
# QUOTE_NONE — never quotes (use escapechar)

Real-World Example: Processing Sales Data

import csv
from collections import defaultdict

def analyze_sales(filename):
    """Analyze sales data from CSV file."""
    department_totals = defaultdict(float)
    row_count = 0
    
    with open(filename, "r") as f:
        reader = csv.DictReader(f)
        for row in reader:
            dept = row["department"]
            amount = float(row["amount"])
            department_totals[dept] += amount
            row_count += 1
    
    print(f"Processed {row_count} sales records\n")
    print(f"{'Department':<20} {'Total Sales':>12}")
    print("-" * 34)
    
    for dept, total in sorted(department_totals.items()):
        print(f"{dept:<20} ${total:>11,.2f}")

# Usage: analyze_sales("sales.csv")

Sample sales.csv:

date,department,product,amount
2025-01-15,Electronics,Laptop,1299.99
2025-01-15,Books,Python Guide,49.99
2025-01-16,Electronics,Phone,899.00
2025-01-16,Books,Data Science,59.99

CSV Quick Reference

Operation Code
Read rows as lists csv.reader(f)
Read rows as dicts csv.DictReader(f)
Write rows from lists csv.writer(f).writerow(row)
Write rows from dicts csv.DictWriter(f, fields).writerow(row)
Skip header next(reader)
Custom delimiter csv.reader(f, delimiter="\t")
Write header writer.writeheader()
Write all rows writer.writerows(data)

Summary

  • Use csv.reader for simple list-based access, DictReader for named columns
  • Use csv.writer / DictWriter for output — always with newline=""
  • Customize delimiters and quoting for different file formats
  • DictReader makes code more readable — reference columns by name, not index

Next up: JSON Files →

Updated: