将csv数字串转换为值

时间:2017-10-24 23:00:54

标签: python csv numpy

我正在尝试读取csv文件中的一行数字,然后单独调用它们来计算它们。到目前为止,这是我的代码:

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)

在csv文件的这一行中,我需要在计算中使用像4.65这样的小数。我尝试过这样的事情:

print(5 + x[14])但它不起作用。

我认为我需要将该行转换为整数列表或其他内容,请帮忙。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

根据您的示例行,您要将delimiter=' '添加到csv.reader()

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

猜测csv的结构,但假设它不包含标题而你想保留小数:

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)

如果您有字符串值,例如'A string'

,则会失败

答案 1 :(得分:1)

以下是使用map的@ GiantsLoveDeathMetal解决方案的替代方法(它还显示了一种向我们提供包含csv文件样本io.StringIO的复制/粘贴代码的方法):

编辑StringIO以包含列中的数据和空行

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)

在python 2中(在某些情况下在python 3中,如果你的代码使用生成器,在本例中不是这种情况),你不需要将map的结果转换为列表

所以line = list(map(float, line))可以被更清晰的map(float, line)取代。哪个可以被认为比列表理解(或生成器表达式)更清晰,更明确。

例如,这将起作用:

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

如果您对map vs列表理解辩论感兴趣,here you go for more details

答案 2 :(得分:0)

是的,确实是Unatiel。

抱歉,不得不为我自己的问题创建答案,显然