CSV, lists, and functions

C

C.T.

Hello,

Currently doing a project for class an I'm stuck. I have a csv file that I'm suppose to extract some information from. I've created a function that ignores the first six lines of the csv file and creates a list of values in aparticular column. Here is the code:


def get_values(file, index):

'''(file object, int) -> list
Return a list of states and corresponding values at a prticular index in file.'''

values_list = []
file.readlines(900)#skipping first 6 lines of file
for line in file:
line_list = line.split(',')
values_list.append(line_list[index])

return values_list



#Prompt for file and prompt again if file is not found
while True:
try:
file_name = input('Enter in file name: ')
input_file = open( file_name, 'r')
break

except IOError:
print('File not found.')

heart_list = get_values(input_file, 1)
motor_list = get_values(input_file, 4)

I can see a list of values for heart_list, but when I print the motor_list I get back an empty list. I think its because I'm not closing the file before calling the function again, but I don't want to prompt for the same fileover and over again because I need to pull at least 10 columns from this csv files and turn them into lists. Any help is appreciated.
 
R

Roy Smith

C.T. said:
Currently doing a project for class an I'm stuck. I have a csv file that I'm
suppose to extract some information from. I've created a function that
ignores the first six lines of the csv file and creates a list of values in a
particular column. Here is the code:


def get_values(file, index):

'''(file object, int) -> list
Return a list of states and corresponding values at a prticular index in
file.'''

values_list = []
file.readlines(900)#skipping first 6 lines of file

Your intent is to skip the first 6 lines, but your code says "skip the
first 900 characters, plus enough to get to the end of the next line".
You're assuming 900 characters gets you to line 6. That's really
fragile.

If you really want to skip the first 6 lines, try something like:

for i in range(6):
file.readline()

The next problem I see is:

for line in file:
line_list = line.split(',')

You don't want to do that. Use the csv module
(http://docs.python.org/2/library/csv.html) to parse the file. It
handles quotes, embedded commas, and all sorts of annoying edge cases
you've probably never thought of.
 
D

Dave Angel

Hello,

Currently doing a project for class an I'm stuck. I have a csv file that I'm suppose to extract some information from. I've created a function that ignores the first six lines of the csv file and creates a list of values in a particular column. Here is the code:


def get_values(file, index):

'''(file object, int) -> list
Return a list of states and corresponding values at a prticular index in file.'''

values_list = []
file.readlines(900)#skipping first 6 lines of file
for line in file:
line_list = line.split(',')
values_list.append(line_list[index])

return values_list



#Prompt for file and prompt again if file is not found
while True:
try:
file_name = input('Enter in file name: ')
input_file = open( file_name, 'r')
break

except IOError:
print('File not found.')

heart_list = get_values(input_file, 1)
motor_list = get_values(input_file, 4)

I can see a list of values for heart_list, but when I print the motor_list I get back an empty list. I think its because I'm not closing the file before calling the function again, but I don't want to prompt for the same file over and over again because I need to pull at least 10 columns from this csv files and turn them into lists. Any help is appreciated.

f.seek(0)

will reposition the file to the beginning.

But you should switch to using the csv module. And unless you have data
that consists of millions of lines, you should just read the whole thing
in once, and then extract the various columns by simple list
manipulations and/or comprehensions.
 
R

Roy Smith

Dave Angel said:
But you should switch to using the csv module. And unless you have data
that consists of millions of lines, you should just read the whole thing
in once, and then extract the various columns by simple list
manipulations and/or comprehensions.

Another possibility is to use pandas (http://pandas.pydata.org/). It's
a bit of effort to master the package, but it's got some neat stuff in
it. Apropos to this thread, it has a very flexible read_csv() function.
You can pass it, for example, skiprows=6, and it'll, well, skip the
first 6 rows.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top