Python Basics — Working with CSV Files
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.readerfor simple list-based access,DictReaderfor named columns - Use
csv.writer/DictWriterfor output — always withnewline="" - Customize delimiters and quoting for different file formats
DictReadermakes code more readable — reference columns by name, not index
Next up: JSON Files →