Home > Net >  list index out of range when appending data in CSV file
list index out of range when appending data in CSV file

Time:05-26

I have a CSV file in which I have data in three columns and I want to add new rows after checking the data exists then want to add these data in new rows but getting the error list index out of range

this is my code

Categories

name
apple
banana
potatoes
onion

CSV data

titles,summaries,terms
apple,,Apple (Fruit)
banana,,Banana (Fruit)
potatoes,,Potato (Vegitable)
onion,,Onion (Vegitable)    
categories = db.table('categories').get()

csv_data = csv.reader(open('categories.csv', "r"))

csv_matched_strings = []
for row in csv_data:
    for category in categories:
        if category.name in row[0]:
            print(row[0]   ': '   row[2])
            csv_matched_strings.append(category.name)
            List = [row[0],'',row[2]]
            with open('categories.csv', 'a ') as f_object:
                writer_object = writer(f_object)
                writer_object.writerow(List)
                f_object.close()

Note: Data is added in the existing CSV file but CSV file writing with a blank line between every loop.

CodePudding user response:

The main issue with the original solution was handling the file. The outer for loop wouldn't stop, since the inner for loop was appending line to the working file.

Here, I used a simple list to store what needs to be duplicated. If the file is too large, another option would be to use a second CSV file as a buffer and then copy it back at the end.

Also, consider using sets when doing look-ups and maybe learn about how the in operator works here is a post you might find helpful.

import csv
from csv import writer

# Since OP hasn't provided the class, consider this a substitute
categories = [
    {'name': 'apple'},
    {'name': 'banana'},
    {'name': 'potatoes'},
    {'name': 'onion'},
]

# set of category names created using a set comprehension
cat = {c['name'] for c in categories}

found_rows = []
csv_matched_strings = []

with open('categories.csv', "r") as f:
    csv_data = csv.reader(f)

    for row in csv_data:
        if row[0] in cat:
            # First value is found in categories
            print(row[0]   ': '   row[2])
            found_rows.append([row[0], '', row[2]])
            # I left it here since it was there in the original code
            csv_matched_strings.append(row[0])

# categories.csv is now closed.
# We open it again in append mode and proceed to append the duplicates
with open('categories.csv', 'a ') as f:
    writer_object = writer(f)
    for row in found_rows:
        writer_object.writerow(row)
  • Related