Christopher Rivas
Christopher Rivas

Reputation: 11

convert csv string of numbers into values

I am trying to read a line of numbers in a csv file, then call on them individually to compute with them. Here is my code so far:

import sys
import os
import csv
import numpy as np

with open('data.csv') as csv_file:
    csv_reader = csv.reader(csv_file)

    for line in csv_reader:

        x = np.array(line[3])
        print(x)

Within this line of the csv file there are numbers with decimals like 4.65 that I need to use in the calculations. I tried things like:

print(5 + x[14]) but it won't work.

I assume I need to convert the line into a list of integers or something, please help.

Thank you in advance.

Upvotes: 1

Views: 2147

Answers (2)

Unatiel
Unatiel

Reputation: 1080

Here is an alternative to @GiantsLoveDeathMetal's solution with map (also it shows a way to provide us a copy/paste-able piece of code containing a sample of your csv file with io.StringIO) :

EDITED the StringIO to contain data in columns and with empty rows

import csv
import io 

f = io.StringIO("""
7.057
7.029

5.843
5.557
4.186
4.1

2.286""")
csv_reader = csv.reader(f, delimiter=' ')
for line in csv_reader:
    line = list(map(float, filter(None, line)))
    print(line)

In python 2 (and in some cases in python 3 if your code works with a generator, which is not the case in this example), you don't need to convert the result of map to a list.

So line = list(map(float, line)) can be replaced by the much cleaner map(float, line). Which can be considered cleaner and more explicit than a list comprehension (or a generator expression).

For instance this will work :

import csv
import io 

f = io.StringIO("""7.057 7.029 5.843 5.557 4.186 4.1 2.286""")
csv_reader = csv.reader(f, delimiter=' ')
for line in csv_reader:
    line = map(float, line)
    print(sum(line))
# 36.05800000000001

If you're interested in the map vs list comprehension debate, here you go for more details.

Upvotes: 1

s3bw
s3bw

Reputation: 3049

According to your example line you want to add delimiter=' ' to the csv.reader()

csv_data = csv.reader(csv_file, delimiter=' ')

Taking a guess at the structure of your csv, but under the assumption that it contains no headings and you want to keep the decimals:

with open('new_data.txt') as csv_file:
    csv_data = csv.reader(csv_file, delimiter=' ')
        for line in csv_data:
            x = [float(n) for n in line.split(',')]
            print(x)

This will fail if you have string values, such as 'A string'

Upvotes: 1

Related Questions