How to Write a CSV File in Python

If you want to save table-like data in Python, a CSV file is a common choice.

A CSV file stores data in rows and columns. Python includes a built-in csv module that makes writing CSV files much easier and safer than building the text yourself.

This page shows you how to:

  • Create a new CSV file in Python
  • Write one row or many rows
  • Use the built-in csv module
  • Understand when to use csv.writer() and csv.DictWriter()

Quick answer #

import csv

rows = [
    ["name", "age", "city"],
    ["Alice", 30, "London"],
    ["Bob", 25, "Paris"]
]

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(rows)

Use newline="" when opening the file. This helps prevent extra blank lines in CSV output.

The simplest way to write a CSV file #

The basic steps are:

  • Import the csv module
  • Open the file in write mode using "w"
  • Use newline="" when opening the file
  • Create a writer with csv.writer(file)
  • Write rows with writer.writerow() or writer.writerows()

Example:

import csv

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)

    writer.writerow(["name", "age", "city"])
    writer.writerow(["Alice", 30, "London"])
    writer.writerow(["Bob", 25, "Paris"])

This creates a file named people.csv.

Its contents will look like this:

name,age,city
Alice,30,London
Bob,25,Paris

If you are not sure how open() works, see the Python open() function explained. For a broader overview of CSV tools, see the Python csv module overview.

Write one row at a time #

Use writer.writerow() when you want to write a single row.

This is useful when:

  • You are building rows inside a loop
  • You only need to add one line at a time
  • Your data is not stored in one big list yet

Each list becomes one row in the CSV file.

Example:

import csv

names = ["Alice", "Bob", "Cara"]

with open("names.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)

    writer.writerow(["name"])

    for name in names:
        writer.writerow([name])

Important detail:

  • writer.writerow() expects one row
  • That row is usually a list or tuple

For example, this is correct:

writer.writerow(["Alice", 30, "London"])

A common beginner mistake is passing a plain value instead of a list.

Write many rows at once #

Use writer.writerows() when you already have a list of rows.

Each inner list becomes one CSV row.

Example:

import csv

rows = [
    ["name", "age", "city"],
    ["Alice", 30, "London"],
    ["Bob", 25, "Paris"],
    ["Cara", 28, "Berlin"]
]

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(rows)

This is a good choice for small, ready-made datasets.

Use:

  • writerow() for one row
  • writerows() for multiple rows

Write CSV files with column names #

Use csv.DictWriter() when your data is stored as dictionaries.

This is helpful when:

  • Your data has named fields like "name" and "age"
  • You want to control the column order
  • You want cleaner code when working with structured data

Set fieldnames to choose the column order, then call writeheader() to write the first row.

Example:

import csv

rows = [
    {"name": "Alice", "age": 30, "city": "London"},
    {"name": "Bob", "age": 25, "city": "Paris"}
]

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["name", "age", "city"])

    writer.writeheader()
    writer.writerows(rows)

This creates:

name,age,city
Alice,30,London
Bob,25,Paris

Why use DictWriter()?

  • The column names are clear
  • You do not need to remember the position of each value
  • You control the output order with fieldnames

Important file options to use #

When writing CSV files, these options matter:

  • encoding="utf-8" for text data
  • newline="" for CSV files
  • "w" to overwrite an existing file
  • "a" to add rows instead of replacing the file

Example using append mode:

import csv

new_row = ["Dana", 31, "Rome"]

with open("people.csv", "a", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(new_row)

This adds a row to the end of the file instead of replacing it.

If you want to learn more about appending, see how to append to a file in Python.

Common problems beginners run into #

Here are the most common mistakes when writing CSV files:

  • Forgetting to import csv
  • Opening the file without newline=""
  • Using "w" when you meant to append with "a"
  • Passing a plain value instead of a list to writerow()
  • Using DictWriter without matching fieldnames

Extra blank lines #

If your CSV file has blank lines between rows, the usual cause is missing newline="".

Wrong:

with open("people.csv", "w", encoding="utf-8") as file:
    writer = csv.writer(file)

Correct:

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)

Badly formatted rows #

Do not build CSV lines yourself with commas like this:

name = "Alice"
age = 30
line = name + "," + str(age)

This may break if values contain commas or quotes.

Use the csv module instead.

DictWriter key problems #

With csv.DictWriter(), the dictionary keys should match the fieldnames.

Example:

import csv

row = {"name": "Alice", "age": 30, "country": "UK"}

with open("people.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["name", "age", "city"])
    writer.writeheader()
    writer.writerow(row)

This can cause problems because "country" does not match "city".

Overwriting your data #

If you open a file with "w", Python replaces the file contents.

Use "a" if you want to keep the old data and add new rows.

When not to use this method #

This method is a good beginner-friendly choice, but not every approach is a good idea.

Avoid manually joining values with commas for real CSV work.

Why?

  • Values may contain commas
  • Values may contain quotes
  • CSV escaping rules can be tricky

Use the csv module when values may contain commas or quotes.

For advanced data analysis, a library like pandas can be easier, but beginners usually do not need it just to create a CSV file.

Debugging tips #

If your code is not working, these quick checks can help:

print(rows)
print(type(rows))
print(type(rows[0]))
print(file.name)

import os
print(os.path.exists("people.csv"))

These checks help you answer questions like:

  • Is rows really a list?
  • Is each row a list or dictionary?
  • What file name are you writing to?
  • Was the file actually created?

If you need to check whether the file exists, see how to check if a file exists in Python.

FAQ #

How do I write a header row in a CSV file? #

With csv.writer(), write the header as the first row.

writer.writerow(["name", "age", "city"])

With csv.DictWriter(), use writeheader().

writer.writeheader()

Why are there blank lines in my CSV file? #

Usually because the file was not opened with newline="".

What is the difference between writerow() and writerows()? #

  • writerow() writes one row
  • writerows() writes multiple rows

Should I use csv.writer() or csv.DictWriter()? #

Use:

  • csv.writer() for lists
  • csv.DictWriter() for dictionaries with named columns

See also #

Press Esc to close