Borislav Hadzhiev
Wed Apr 20 2022·2 min read
Photo by Raychan
The Python "NameError: name 'csv' is not defined" occurs when we use the csv
module without importing it first. To solve the error, import the csv
module
before using it - import csv
.
Here is an example of how the error occurs.
with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['first_name', 'last_name'] # ⛔️ NameError: name 'csv' is not defined writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Alice', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Bob', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Carl', 'last_name': 'Smith'})
To solve the error, we have to import the csv module.
# ✅ import csv module first import csv with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Alice', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Bob', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Carl', 'last_name': 'Smith'})
Even though the csv
module is in the Python standard library, we still have to
import it before using it.
c
when importing csv
because module names are case-sensitive.Also, make sure you haven't imported csv
in a nested scope, e.g. a function.
Import the module at the top level to be able to use it throughout your code.
An alternative to importing the entire csv
module is to import only the
functions and classes that your code uses.
from csv import DictWriter with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['first_name', 'last_name'] writer = DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Alice', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Bob', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Carl', 'last_name': 'Smith'})
The example shows how to import the DictWriter
class from the csv
module.
Instead of accessing the members on the module, e.g. csv.DictWriter
, we now
access them directly.
This should be your preferred approach because it makes your code easier to read.
import csv
, it is much harder to see which classes or functions from the csv
module are being used in the file.Conversely, when we import specific classes, it is much easier to see which
classes and methods from the csv
module are being used.
The csv
module implements classes to read and write tabular data in CSV
format.
You can view all of the classes and methods the csv
module provides by
visiting the official docs.