Jacob Fuchs
Jacob Fuchs

Reputation: 357

Open a csv file in 'rb' mode and iterate over it

I've seen an older answer for the post, Inline CSV File Editing with Python, about how to modify a csv file and save it. It uses the tempfile module. I have used the same code in Python 3.6 but I get an error because I read the file in binary mode and I cannot iterate over it.

The code below creates a simple CSV file

import csv

with open('proglanguages.csv', mode='w', newline='') as csv_file:
    fieldnames = ['lang', 'value']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writerow({'lang': 'Java', 'value': '90'})
    writer.writerow({'lang': 'c', 'value': '80'})
    writer.writerow({'lang': 'Perl', 'value': '78'})
    writer.writerow({'lang': 'C++', 'value': '92'})
    writer.writerow({'lang': 'Python', 'value': '0'})
    writer.writerow({'lang': 'Fortran', 'value': '70'})

The code below modifies the previous generated CSV file,

from tempfile import NamedTemporaryFile
import shutil
import csv

filename = 'proglanguages.csv'
tempfile = NamedTemporaryFile(delete=False)


with open(filename, mode='rb') as csvFile, tempfile:
    reader = csv.reader(csvFile, delimiter=',', quotechar='"')
    writer = csv.writer(tempfile, delimiter=',', quotechar='"')

    for row in reader:
        if row[0] == 'Python':
            row[1] = '100'
            writer.writerow(row)
        else:
            writer.writerow(row)

shutil.move(tempfile.name, filename)

In which way, could I use the for-loop for iteration, modify the item and write in the tempfile

Upvotes: 0

Views: 1866

Answers (1)

Serge Ballesta
Serge Ballesta

Reputation: 149125

You are not lucky here. Answers from Martijn Pieters are always high quality ones. This one was but was targetted at Python 2 while you use Python 3. And the csv semantics have changed... You should no longer use binary mode in Python 3 and do what you did for the initial csv file:

...
tempfile = NamedTemporaryFile(delete=False, newline='', mode='w')

with open(filename, mode='r', newline='') as csvFile, tempfile:
    reader = csv.reader(csvFile)
    writer = csv.writer(tempfile)
    ...

Upvotes: 2

Related Questions