Python CSV: Read &; Write CSV Files

In this tutorial, you will learn about reading and writing CSV files in Python with the help of examples.

CSV File

CSV is the most popular file format for working with tabular data. It has a .csv file extension, and when we load it to a text file (other than spreadsheets or tables), you will see each element will be separated by a single character (generally commas). For example,

Name, Age, Country
Maria, 21, Italy
Sudip, 26, Nepal
Sanjay, 19, India

Python CSV

Python provides a built-in module named csv that makes working with csv files a lot easier, and to use it, we must first import it.

import csv

After importing, we can perform file operations like Reading and Writing on the csv file.

1. Read CSV File

The csv module provides a reader() function to perform the read operation.

Suppose we have a csv file like this

Name, Age, Country
Maria, 21, Italy
Sudip, 26, Nepal
Sanjay, 19, India

Now, let's use the reader() function to read this file.

import csv

with open('info.csv', 'r') as file:
    csv_reader = csv.reader(file)

    # read each row of the csv file
    for row in csv_reader:
        print(row)

Output

['Name', ' Age', ' Country']
['Maria', ' 21', ' Italy']
['Sudip', ' 26', ' Nepal']
['Sanjay', ' 19', ' India']

In the above example, we have imported the csv module in our program. We then open the info.csv file using open(). This is similar to opening any file in Python. To learn more, visit Python files.

Here, we have used the csv.reader() function to read the csv file. This function returns an iterable object which we then accessed using a for loop.

The above code works fine if each row of the csv file is separated by commas, which might not be the case all the time. Sometimes, in text editors, csv files are separated by the - symbol or a tab.

In such cases, we have to provide the optional delimiter argument to the reader() function. For example, if we have a csv file where data is separated by tabs.

Name-Age-Country
Maria-21-Italy
Sudip-26-Nepal
Sanjay-19-India

Let's first see what happens with the older code

import csv

with open('info.csv', 'r') as file:
    csv_reader = csv.reader(file)

    # read each row of the csv file
    for row in csv_reader:
        print(row)

Output

['Name-Age-Country']
['Maria-21-Italy']
['Sudip-26-Nepal']
['Sanjay-19-India']

Here, the code runs fine, but if you look into the output carefully, you can see the individual columns of the csv files are treated as a single element, 'Name-Age-Country', 'Maria-21-Italy', etc.

Now, let's use the delimiter parameter.

import csv

with open('info.csv', 'r') as file:
    csv_reader = csv.reader(file, delimiter = '-')

    # read each row of the csv file
    for row in csv_reader:
        print(row)

Output

['Name', 'Age', 'Country']
['Maria', '21', 'Italy']
['Sudip', '26', 'Nepal']
['Sanjay', '19', 'India']

This time we get the desired output.


2. Write CSV FIle

Similar to the reader() function, the csv module also provides the writer() function to write data to a file.

Let's see an example,

import csv

with open('info.csv', 'w') as file:
    csv_writer = csv.writer(file)

    csv_writer.writerow(['Name', 'Age', 'Country'])
    csv_writer.writerow(['Steve', 32, 'Australis'])
    csv_writer.writerow(['Messi', 34, 'Argentina'])
    csv_writer.writerow(['Ronaldo', 37, 'Portugal'])

Here, we have used the writer() function to get a writer object, which we then used to call the writerow() function. The writerow() function writes the provided data to the csv file.

After running the above code, our info.csv file will look something like this.

You can see there is one line after each row of data, which doesn't look good. Let's change it.

import csv

with open('info.csv', 'w', newline='') as file:
    csv_writer = csv.writer(file)

    csv_writer.writerow(['Name', 'Age', 'Country'])
    csv_writer.writerow(['Steve', 32, 'Australis'])
    csv_writer.writerow(['Messi', 34, 'Argentina'])
    csv_writer.writerow(['Ronaldo', 37, 'Portugal'])

If you look carefully, you can see we have now added the newline='' parameter to the open() function. By default, it has \n value, so we have seen the previous output.

Now when we run this code, our file will look like this:

Write data with a delimiter

Instead of , as the delimiter, we can also provide a custom single character delimiter. For example,

import csv

with open('info.csv', 'w', newline='') as file:
    csv_writer = csv.writer(file, delimiter = '-')

    csv_writer.writerow(['Name', 'Age', 'Country'])
    csv_writer.writerow(['Steve', 32, 'Australis'])
    csv_writer.writerow(['Messi', 34, 'Argentina'])
    csv_writer.writerow(['Ronaldo', 37, 'Portugal'])

info.csv file

Note: When we perform the write operation on the csv file, the initial content of that file will be replaced by the new content. For example, before, our file looked like this.

And when we run the code with a delimiter, this content is replaced by


Writing List Content to CSV File

Instead of writing individual data, we can create a nested list and then write data from the list to our csv file. For example,

import csv

# list of data to be stored in the csv file
csv_data = [['Name', 'Age', "Country"], ['Pedri', 19, 'Spain'],
            ['Messi', 34, 'Argentina'], ['Ronaldo', 37, 'Portugal']]

with open('info.csv', 'w', newline='') as file:
    csv_writer = csv.writer(file, delimiter = '-')
    csv_writer.writerows(csv_data)

This time, we have used the writerows() function because we are writing multiple rows at the same time. If we run the code, our info.csv file will look like this.


Python CSV with Dictionary

So far, we have been reading and writing csv files using Python List, now, let's use a dictionary to perform the read and write operations on csv.

1. Read CSV using Dictionary

We use the DictReader() function to read the csv file as a dictionary. For example,

info.csv

Name, Age, Country
Pedri, 19, Spain
Messi, 34, Argentina
Ronaldo, 37, Portugal

main.py

import csv

with open('info.csv', 'r') as file:
    csv_reader = csv.DictReader(file)

    for row in csv_reader:
        print(row)

Output

{'Name': 'Pedri', ' Age': ' 19', ' Country': ' Spain'}
{'Name': 'Messi', ' Age': ' 34', ' Country': ' Argentina'}
{'Name': 'Ronaldo', ' Age': ' 37', ' Country': ' Portugal'}

As you can see we now get the result as a dictionary as the key/value pairs where data of the first row acts as keys and all other data acts as values.

2. Write CSV using Dictionary

Similarly, we can use the DictWriter() to write data from a dictionary to a csv file. For example,

main.py

import csv

# create a list with dictionary nested inside it
csv_data = [ {'Name': 'Pedri', 'Age': 19, 'Country': 'Spain'}, {'Name': 'Messi', 'Age': 34, 'Country': 'Argentina'}, {'Name': 'Ronaldo', 'Age': 37, 'Country': 'Portugal'}
            ]

field_names = ['Name', 'Age', 'Country']

with open('info.csv', 'w', newline = '') as file:
    csv_writer = csv.DictWriter(file, fieldnames = field_names)

    csv_writer.writeheader()
    csv_writer.writerows(csv_data)

info.csv

When we compare it to writing as a list, we have added

  • field_names to specify the name of each field in the csv file
  • writeheader() to write the header of the csv file

Read CSV using Panda

Besides csv, Python also provides the panda module, which we can use to perform various operations on csv files. For example,

info.csv

main.py

import pandas

print(pandas.read_csv('info.csv'))

Output

      Name  Age    Country
0    Pedri   19      Spain
1    Messi   34  Argentina
2  Ronaldo   37   Portugal

Here, the read_csv() function reads the content of the info.csv file. Similarly, we can also read csv content using pandas, which we will discuss in upcoming tutorials.

Did you find this article helpful?