CSV files store data in a simple table format. Reading and writing CSV lets your program work with this common data type easily.
Reading and writing CSV data in Python
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
Python
import csv # Reading CSV with open('file.csv', 'r', newline='') as file: reader = csv.reader(file) for row in reader: print(row) # Writing CSV with open('file.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerow(['Name', 'Age']) writer.writerow(['Alice', '30'])
Use csv.reader to read rows from a CSV file.
Use csv.writer to write rows to a CSV file.
Examples
data.csv and prints it as a list of strings.Python
import csv with open('data.csv', 'r', newline='') as file: reader = csv.reader(file) for row in reader: print(row)
output.csv: a header and one data row.Python
import csv with open('output.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerow(['City', 'Population']) writer.writerow(['Paris', '2148000'])
DictReader reads CSV rows as dictionaries, so you can access columns by name.Python
import csv with open('data.csv', 'r', newline='') as file: reader = csv.DictReader(file) for row in reader: print(row['Name'], row['Age'])
DictWriter writes rows as dictionaries with named columns.Python
import csv with open('output.csv', 'w', newline='') as file: fieldnames = ['Name', 'Age'] writer = csv.DictWriter(file, fieldnames=fieldnames) writer.writeheader() writer.writerow({'Name': 'Bob', 'Age': 25})
Sample Program
This program first writes two rows of data to people.csv. Then it reads the file and prints each row as a list.
Python
import csv # Write sample data to CSV with open('people.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerow(['Name', 'Age']) writer.writerow(['Alice', 30]) writer.writerow(['Bob', 25]) # Read and print the CSV data with open('people.csv', 'r', newline='') as file: reader = csv.reader(file) for row in reader: print(row)
Important Notes
Always open CSV files with newline='' to avoid extra blank lines on some systems.
CSV data is text, so numbers are read as strings unless converted.
Use DictReader and DictWriter for easier column access by name.
Summary
CSV files store data in rows and columns separated by commas.
Use Python's csv module to read and write CSV files easily.
Reading returns rows as lists or dictionaries; writing sends lists or dictionaries as rows.
Practice
1. What does the Python
csv.reader function do when reading a CSV file?easy
Solution
Step 1: Understand csv.reader purpose
Thecsv.readerreads CSV files and returns each row as a list of strings representing columns.Step 2: Differentiate from other functions
Functions likecsv.DictReaderreturn dictionaries, and writing functions save data, not read it.Final Answer:
It reads the file and returns each row as a list of strings. -> Option BQuick Check:
csv.reader returns lists [OK]
Hint: csv.reader reads rows as lists, not dictionaries [OK]
Common Mistakes:
- Confusing csv.reader with csv.DictReader
- Thinking csv.reader writes data
- Assuming it deletes or modifies files
2. Which of the following is the correct way to open a CSV file for writing in Python?
easy
Solution
Step 1: Identify mode for writing CSV
To write CSV files, open the file in write mode 'w' and usenewline=''to prevent extra blank lines on Windows.Step 2: Check other options
'r' is read mode, 'a' is append (valid but not asked), 'rb' is binary read mode (not for writing text CSV).Final Answer:
open('file.csv', 'w', newline='') -> Option AQuick Check:
Write mode with newline='' [OK]
Hint: Use 'w' mode with newline='' to write CSV files correctly [OK]
Common Mistakes:
- Forgetting newline='' causes blank lines
- Using 'r' mode when writing
- Using binary mode for text CSV
3. What will be the output of this code snippet?
import csv
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Name', 'Age'])
writer.writerow(['Alice', 30])
with open('data.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row)medium
Solution
Step 1: Writing rows with csv.writer
The code writes two rows: header ['Name', 'Age'] and data ['Alice', 30]. Numbers are converted to strings when written.Step 2: Reading rows with csv.reader and printing
Reading returns each row as a list of strings. print(row) shows repr with quotes: ['Name', 'Age'] and ['Alice', '30'].Final Answer:
['Name', 'Age']\n['Alice', '30'] -> Option CQuick Check:
csv.writer writes lists, csv.reader reads lists [OK]
Hint: csv.reader returns lists of strings, print shows quotes around all elements [OK]
Common Mistakes:
- Expecting printed rows as comma strings
- Confusing string and integer types in output
- Assuming encoding error without cause
4. Identify the error in this code that reads a CSV file:
import csv
with open('file.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row)medium
Solution
Step 1: Check code indentation
The print statement inside the for loop must be indented to be part of the loop body.Step 2: Verify other parts
Import is present, file mode 'r' is correct for reading, and newline argument is not needed for reading.Final Answer:
Indentation error in the for loop -> Option AQuick Check:
Python requires correct indentation [OK]
Hint: Indent inside loops to avoid syntax errors [OK]
Common Mistakes:
- Forgetting to indent inside loops
- Thinking newline is needed for reading
- Confusing file modes
5. You want to read a CSV file where the first row contains column names, and then write a new CSV file with only rows where the 'Age' column is greater than 25. Which approach is correct?
hard
Solution
Step 1: Choose reading method with headers
csv.DictReader reads CSV rows as dictionaries using the first row as keys, making it easy to filter by column names like 'Age'.Step 2: Filter and write with headers
Filter rows where 'Age' > 25, then write using csv.DictWriter with fieldnames to include headers properly.Final Answer:
Use csv.DictReader to read rows as dictionaries, filter by 'Age' key, then write with csv.DictWriter including header. -> Option DQuick Check:
DictReader + DictWriter for header and filtering [OK]
Hint: Use DictReader/DictWriter for header-based filtering [OK]
Common Mistakes:
- Skipping header manually instead of using DictReader
- Writing without headers causing missing columns
- Using csv.writer without filtering logic
