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.
Dictionary-based CSV handling in Python
Start learning this pattern below
Jump into concepts and practice - no test required
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.
import csv with open('people.csv', 'r', newline='') as file: reader = csv.DictReader(file) for row in reader: print(row['Name'], row['Age'])
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'})
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.
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']}")
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.
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
csv.DictReader over csv.reader when reading CSV files?Solution
Step 1: Understand
csv.readerbehaviorcsv.readerreads CSV rows as lists, so you access data by index positions.Step 2: Understand
csv.DictReaderbehaviorcsv.DictReaderreads rows as dictionaries, letting you access data by column names, which is clearer and safer if column order changes.Final Answer:
It allows accessing data by column names instead of index positions. -> Option DQuick Check:
DictReader uses column names for access [OK]
- Thinking DictReader reads entire file at once
- Assuming DictReader converts data types automatically
- Confusing reading with writing functions
csv.DictWriter object to write a CSV with columns 'name' and 'age'?Solution
Step 1: Recall the parameter name for columns in DictWriter
The correct parameter to specify column names isfieldnames.Step 2: Check the options
Only csv.DictWriter(file, fieldnames=['name', 'age']) usesfieldnamescorrectly; others use incorrect parameter names.Final Answer:
csv.DictWriter(file, fieldnames=['name', 'age']) -> Option AQuick Check:
Use fieldnames to set columns [OK]
- Using 'columns' or 'keys' instead of 'fieldnames'
- Forgetting to pass a file object first
- Confusing DictReader and DictWriter parameters
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'])Solution
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.Step 2: Analyze the print statement
It prints the values of 'name' and 'age' keys separated by space for each row.Final Answer:
Alice 30 Bob 25 -> Option AQuick Check:
Prints name and age values separated by space [OK]
- Printing the whole dictionary instead of values
- Mixing order of printed values
- Confusing list output with string output
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})Solution
Step 1: Check DictWriter usage
DictWriter requires callingwriteheader()to write the header row before writing data rows.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.Final Answer:
Missing call to writer.writeheader() before writing rows. -> Option CQuick Check:
Always call writeheader() before writerow() [OK]
- Forgetting writeheader() call
- Opening file in binary mode unnecessarily
- Thinking fieldnames must be tuple
- Assuming all values must be strings
csv.DictReader and create a dictionary mapping each 'id' to the 'score' as an integer. Which code snippet correctly does this?Solution
Step 1: Use DictReader to access columns by name
Onlycsv.DictReaderallows accessing 'id' and 'score' by keys.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.Final Answer:
with open('data.csv') as f: reader = csv.DictReader(f) result = {row['id']: int(row['score']) for row in reader} -> Option BQuick Check:
DictReader + dict comprehension + int conversion [OK]
- Using csv.reader instead of DictReader
- Swapping keys and values in dictionary
- Not converting score to int
- Converting id to int instead of score
