Home > OS >  Why is my list coming up blank when trying to import data from a CSV file?
Why is my list coming up blank when trying to import data from a CSV file?

Time:06-01

Python is completely new to me and i'm still trying to figure out the basics... we were given a project to analyse and determine particular things in a csv file that was given to us.

There are many columns, but the first is most important as one of the variables in the function we need to create is for the first column. It's labelled 'adultids' where a combination of letters and numbers are given, and one 'adultid' takes up 15 rows of different information - there's many different 'adultids' within the file.

So start it off I am trying to make a list from that csv file that contains only the information from the 'adultsID' given (which, as a variable in the function, is a list of two 'adultids' from the csv file), basically trying to single out that information from the rest of the data in the csv file. When i run it, it comes up with '[]', and i cant figure out why... can someone tell me whats wrong?

I'm not sure if any of that makes sense, its very hard to describe, so i apologise in advance, but here is the code i tried:)

    def file_to_read(csvfile, adultIDs):
        with open(csvfile, 'r') as asymfile:
            lst = asymfile.read().split("\n")
        new_lst = []
        if adultIDs == True:
            for row in lst:
                adultid, point, x, y, z = row.split(',')
                if adultid == adultIDs:
                    new_lst.append([adultid, point, x, y, z])
        return new_lst

CodePudding user response:

Try this.

This is because if you give adultIDs to False Then you get the output [], because you assign the new_lst to []


def file_to_read(csvfile, adultIDs):
    with open(csvfile, 'r') as asymfile:
        lst = asymfile.read().split("\n")
    new_lst = []
    if adultIDs == True:
        for row in lst:
            adultid, point, x, y, z = row.split(',')
            if adultid == adultIDs:
                new_lst.append([adultid, point, x, y, z])
        return new_lst
    return lst

CodePudding user response:

As far as I understand, you pass a list of ids like ['R10', 'R20', 'R30'] to the second argument of your function. Those ids are also contained in the csv-file, you are trying to parse. In this case you should, probably, rewrite your function, in a way, that checks if the adultid from a row of your csv-file is contained in the list adultIDs that you pass into your function. I'd rather do it like this:

def file_to_read(csvfile, adult_ids): # [1]
    lst = []
    with open(csvfile, 'r') as asymfile:
        for row in asymfile: # [2]
            r = row[:-1].split(',') # [3]
            if r[0] in adult_ids: # [4]
                lst.append(r)
    return lst

Description for commented digits in brackets:

  1. Python programmers usually prefer snake_case names for variables and arguments. You can learn more about it in PEP 8. Although it's not connected to your question, it may just be helpful for your future projects, when other programmers will review your code. Here I also would recommend
  2. You don't need to read the whole file in a variable. You can iterate it row by row, thus saving memory. This may be helpful if you use huge files, or lack of memory.
  3. You need to take the whole string except last character, which is \n.
  4. in checks if the adult_id from the row of a csv-file is contained in the argument, that you pass. Thus I would recommend using set datatype for adult_ids rather than list. You can read about sets in documentation.

I hope I got your task right, and that helps you. Have a nice day!

  • Related