Home > Software design >  A function to read CSV data from a file into memory
A function to read CSV data from a file into memory

Time:01-03

I am trying to create a function that reads a csv file into a memory in a list form. When I run my code, it gives me this error message ("string indices must be integers"). Were am I getting it wrong. Below is the code. Thanks for your help

# create the empty set to carry the values of the columns

Hydropower_heading = []
Solar_heading = []
Wind_heading = []
Other_heading = []

def my_task1_file(filename):                              # defines the function "my_task1_file"
    with open(filename,'r') as myNew_file:                # opens and read the file
        for my_file in myNew_file.readlines():            # loops through the file

# read the values into the empty set created
            Hydropower_heading.append(my_file['Hydropower'])
            Solar_heading.append(my_file['Solar'])
            Wind_heading.append(my_file['Wind'])
            Other_heading.append(my_file['Other'])

#Hydropower_heading = int(Hydropower)
#Solar_heading = int(Solar)
#Wind_heading = int(Wind)
#Other_heading = int(Other)            
            
my_task1_file('task1.csv')                                # calls the csv file into the function 

# print the Heading and the column values in a row form
print('Hydropower: ', Hydropower_heading)
print('Solar: ', Solar_heading)
print('Wind: ', Wind_heading)
print('Other: ', Other_heading)

CodePudding user response:

We can read CSV files by the column using csv.DictReader method.

Code: (code.py)

import csv


def my_task1_file(filename):  # defines the function "my_task1_file"
    Hydropower_heading = []
    Solar_heading = []
    Wind_heading = []
    Other_heading = []
    with open(filename, newline='\n') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            # read the values into the empty set created
            Hydropower_heading.append(row['Hydropower'])
            Solar_heading.append(row['Solar'])
            Wind_heading.append(row['Wind'])
            Other_heading.append(row['Other'])
    return Hydropower_heading, Solar_heading, Wind_heading, Other_heading

if __name__ == "__main__":
    Hydropower_heading, Solar_heading, Wind_heading, Other_heading = my_task1_file('task1.csv')

    # print the Heading and the column values in a row form
    print('Hydropower: ', Hydropower_heading)
    print('Solar: ', Solar_heading)
    print('Wind: ', Wind_heading)
    print('Other: ', Other_heading)

task1.csv:

Hydropower,Solar,Wind,Other
5,6,3,8
6,8,5,12
3,6,9,7

Output:

Hydropower:  ['5', '6', '3']
Solar:  ['6', '8', '6']
Wind:  ['3', '5', '9']
Other:  ['8', '12', '7']

Explanation:

  • The __main__ condition will check if the file is running directly. If the file is being run directly by using python code.py, it will execute this portion. Otherwise if we import code.py from another python file, this portion will not be executed.
  • You can remove the __main__ block as necessary like below. But it is a good practice to separate the methods from executing while importing one python file from another using the __main__ block. Let me know if it clears your confusion.

code.py (without __main__):

import csv


def my_task1_file(filename):  # defines the function "my_task1_file"
    Hydropower_heading = []
    Solar_heading = []
    Wind_heading = []
    Other_heading = []
    with open(filename, newline='\n') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            # read the values into the empty set created
            Hydropower_heading.append(row['Hydropower'])
            Solar_heading.append(row['Solar'])
            Wind_heading.append(row['Wind'])
            Other_heading.append(row['Other'])
    return Hydropower_heading, Solar_heading, Wind_heading, Other_heading

Hydropower_heading, Solar_heading, Wind_heading, Other_heading = my_task1_file('task1.csv')

print('Hydropower: ', Hydropower_heading)
print('Solar: ', Solar_heading)
print('Wind: ', Wind_heading)
print('Other: ', Other_heading)

References:

CodePudding user response:

Since the error is "string indices must be integers", you must be using a data type that cannot take in a string value as an index. In this segment of your code...

for my_file in myNew_file.readlines():
     
     Hydropower_heading.append(my_file['Hydropower'])
     Solar_heading.append(my_file['Solar'])
     Wind_heading.append(my_file['Wind'])
     Other_heading.append(my_file['Other'])

... you are using "Hydropower", "Solar", "Wind", and "Other" as index values, which cannot be valid index values of my_file, which, I assume, is a string data type since you are reading the file myNew_file. If you change these values to integers as is appropriate, then the error should not appear anymore.

  • Related