Bird
Raised Fist0
Pythonprogramming~5 mins

Dictionary-based CSV handling in Python

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Dictionary-based CSV handling lets you read and write CSV files using column names instead of numbers. This makes your code easier to understand and less error-prone.

When you want to read a CSV file and access data by column names like 'Name' or 'Age'.
When you want to write data to a CSV file and specify columns by their names.
When the order of columns in the CSV might change but you still want to access data correctly.
When you want clearer code that shows what each value means without guessing column positions.
Syntax
Python
import csv

# Reading CSV as dictionaries
with open('file.csv', mode='r', newline='') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row['ColumnName'])

# Writing CSV from dictionaries
with open('file.csv', mode='w', newline='') as file:
    fieldnames = ['Column1', 'Column2']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Column1': 'Value1', 'Column2': 'Value2'})

DictReader reads each row as a dictionary with keys from the header row.

DictWriter writes dictionaries to CSV rows using specified fieldnames as columns.

Examples
This reads a CSV file named 'people.csv' and prints the 'Name' and 'Age' columns for each row.
Python
import csv

with open('people.csv', 'r', newline='') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row['Name'], row['Age'])
This writes two rows to 'people.csv' with columns 'Name' and 'Age'.
Python
import csv

fieldnames = ['Name', 'Age']
with open('people.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Name': 'Alice', 'Age': '30'})
    writer.writerow({'Name': 'Bob', 'Age': '25'})
Sample Program

This program first writes two people's data to a CSV file using dictionary keys as columns. Then it reads the file back and prints a friendly sentence for each person using the column names.

Python
import csv

# Write sample data to CSV using DictWriter
fieldnames = ['Name', 'Age', 'City']
with open('sample.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Name': 'John', 'Age': '28', 'City': 'New York'})
    writer.writerow({'Name': 'Emma', 'Age': '22', 'City': 'London'})

# Read the CSV back using DictReader
with open('sample.csv', 'r', newline='') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(f"{row['Name']} is {row['Age']} years old and lives in {row['City']}")
OutputSuccess
Important Notes

Always open CSV files with newline='' to avoid extra blank lines on some systems.

If a dictionary is missing a field when writing, that column will be empty in the CSV.

DictReader uses the first row of the CSV as keys automatically.

Summary

Dictionary-based CSV handling uses column names to read and write data.

It makes code easier to read and safer when column order changes.

Use csv.DictReader to read and csv.DictWriter to write CSV files with dictionaries.

Practice

(1/5)
1. What is the main advantage of using csv.DictReader over csv.reader when reading CSV files?
easy
A. It writes data back to the CSV file.
B. It reads the entire file into memory at once.
C. It automatically converts all values to integers.
D. It allows accessing data by column names instead of index positions.

Solution

  1. Step 1: Understand csv.reader behavior

    csv.reader reads CSV rows as lists, so you access data by index positions.
  2. Step 2: Understand csv.DictReader behavior

    csv.DictReader reads rows as dictionaries, letting you access data by column names, which is clearer and safer if column order changes.
  3. Final Answer:

    It allows accessing data by column names instead of index positions. -> Option D
  4. Quick Check:

    DictReader uses column names for access [OK]
Hint: DictReader uses column names, not positions, for easier access [OK]
Common Mistakes:
  • Thinking DictReader reads entire file at once
  • Assuming DictReader converts data types automatically
  • Confusing reading with writing functions
2. Which of the following is the correct way to create a csv.DictWriter object to write a CSV with columns 'name' and 'age'?
easy
A. csv.DictWriter(file, fieldnames=['name', 'age'])
B. csv.DictWriter(file, columns=['name', 'age'])
C. csv.DictWriter(file, keys=['name', 'age'])
D. csv.DictWriter(file, headers=['name', 'age'])

Solution

  1. Step 1: Recall the parameter name for columns in DictWriter

    The correct parameter to specify column names is fieldnames.
  2. Step 2: Check the options

    Only csv.DictWriter(file, fieldnames=['name', 'age']) uses fieldnames correctly; others use incorrect parameter names.
  3. Final Answer:

    csv.DictWriter(file, fieldnames=['name', 'age']) -> Option A
  4. Quick Check:

    Use fieldnames to set columns [OK]
Hint: Use 'fieldnames' to specify columns in DictWriter [OK]
Common Mistakes:
  • Using 'columns' or 'keys' instead of 'fieldnames'
  • Forgetting to pass a file object first
  • Confusing DictReader and DictWriter parameters
3. What will be the output of this code snippet?
import csv
from io import StringIO

csv_data = "name,age\nAlice,30\nBob,25"
file = StringIO(csv_data)
reader = csv.DictReader(file)
for row in reader:
    print(row['name'], row['age'])
medium
A. Alice 30 Bob 25
B. ['Alice', '30'] ['Bob', '25']
C. {'name': 'Alice', 'age': '30'} {'name': 'Bob', 'age': '25'}
D. 30 Alice 25 Bob

Solution

  1. Step 1: Understand the CSV data and DictReader

    The CSV has two rows with columns 'name' and 'age'. DictReader reads each row as a dictionary.
  2. Step 2: Analyze the print statement

    It prints the values of 'name' and 'age' keys separated by space for each row.
  3. Final Answer:

    Alice 30 Bob 25 -> Option A
  4. Quick Check:

    Prints name and age values separated by space [OK]
Hint: DictReader rows are dicts; print keys to get values [OK]
Common Mistakes:
  • Printing the whole dictionary instead of values
  • Mixing order of printed values
  • Confusing list output with string output
4. Identify the error in this code that writes a CSV file using csv.DictWriter:
import csv
with open('output.csv', 'w') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'])
    writer.writerow({'name': 'Alice', 'age': 30})
    writer.writerow({'name': 'Bob', 'age': 25})
medium
A. Dictionaries passed to writerow must have string values only.
B. Fieldnames list should be a tuple, not a list.
C. Missing call to writer.writeheader() before writing rows.
D. The file should be opened in binary mode 'wb'.

Solution

  1. Step 1: Check DictWriter usage

    DictWriter requires calling writeheader() to write the header row before writing data rows.
  2. Step 2: Verify other parts

    Opening file in text mode 'w' is correct in Python 3, fieldnames can be a list, and values can be int or str.
  3. Final Answer:

    Missing call to writer.writeheader() before writing rows. -> Option C
  4. Quick Check:

    Always call writeheader() before writerow() [OK]
Hint: Call writeheader() before writing rows with DictWriter [OK]
Common Mistakes:
  • Forgetting writeheader() call
  • Opening file in binary mode unnecessarily
  • Thinking fieldnames must be tuple
  • Assuming all values must be strings
5. You have a CSV file with columns 'id', 'name', and 'score'. You want to read it using csv.DictReader and create a dictionary mapping each 'id' to the 'score' as an integer. Which code snippet correctly does this?
hard
A. with open('data.csv') as f: reader = csv.DictReader(f) result = {int(row['id']): row['score'] for row in reader}
B. with open('data.csv') as f: reader = csv.DictReader(f) result = {row['id']: int(row['score']) for row in reader}
C. with open('data.csv') as f: reader = csv.reader(f) result = {row['id']: int(row['score']) for row in reader}
D. with open('data.csv') as f: reader = csv.DictReader(f) result = {row['score']: int(row['id']) for row in reader}

Solution

  1. Step 1: Use DictReader to access columns by name

    Only csv.DictReader allows accessing 'id' and 'score' by keys.
  2. Step 2: Create dictionary with 'id' as key and integer 'score' as value

    with open('data.csv') as f: reader = csv.DictReader(f) result = {row['id']: int(row['score']) for row in reader} correctly converts 'score' to int and uses 'id' as key.
  3. Final Answer:

    with open('data.csv') as f: reader = csv.DictReader(f) result = {row['id']: int(row['score']) for row in reader} -> Option B
  4. Quick Check:

    DictReader + dict comprehension + int conversion [OK]
Hint: Use DictReader and dict comprehension with int() conversion [OK]
Common Mistakes:
  • Using csv.reader instead of DictReader
  • Swapping keys and values in dictionary
  • Not converting score to int
  • Converting id to int instead of score