【问题标题】:Python - ValueError: invalid literal for float():Python - ValueError:float()的无效文字:
【发布时间】:2013-01-15 03:35:15
【问题描述】:

我有一个 csv 文件,我正在尝试计算其中存在的每一列的平均值。

#!/usr/bin/python

with open('/home/rnish/Desktop/lbm-reference.dat.ref-2013-01-30-13-00-15big.csv', "rU") as f:
    columns = f.readline().strip().split(' ')
    numRows = 0
    sums = [0] * len(columns)

    for line in f:
        values = line.split(" ")
        print values
        for i in xrange(len(values)):
           sums[i] += float(values[i])
        numRows += 1

#    for index, summedRowValue in enumerate(sums):
#        print columns[index], 1.0 * summedRowValue / numRows

我得到的错误是:

  File "excel.py", line 15, in <module>
    sums[i] += float(values[i])
ValueError: invalid literal for float(): 0,536880742,8861743,0,4184866,4448905

print values 的输出是这样的:

['0,256352728,10070198,5079543,5024472,34764\n']
['0,352618127,10102320,4987654,3082111,1902909\n']
['0,505838297,9977968,423278,4709666,5041639\n']
['0,506598469,10083489,0,5032146,5054715\n']
['0,536869414,7229488,39934,4322290,3607046\n']

这是 csv 文件的外观:

0,256641418,10669052,4803710,4759922,0
0,484517531,9889830,1457230,4084777,4959529
0,506902273,9673699,0,5281012,5293376

有人能解释一下并帮助我理解这个问题吗:

我在阅读了几篇帖子后假设这是由于换行符造成的。我说的对吗?

【问题讨论】:

    标签: python linux csv numpy


    【解决方案1】:

    使用numpy

    import numpy as np
    
    a = np.loadtxt("data.csv", delimiter=",")
    mean = np.mean(a, axis=0)
    print(mean)
    

    使用csv module

    import csv
    import sys
    
    it = csv.reader(sys.stdin, quoting=csv.QUOTE_NONNUMERIC)
    avg = next(it, [])
    count = 1
    for count, row in enumerate(it, start=2):
         for i, value in enumerate(row):
              avg[i] += value
    avg = [a/count for a in avg]
    print(avg)
    

    Output

    [0.0, 431655407.0, 9492692.6, 2106081.8, 4434137.0, 3128214.6]
    

    【讨论】:

    • mean = np.mean(a, axis=0) 它在[ 0.00000000e+00 5.49352277e+08 1.06912389e+07 7.33264049e+06 6.79808023e+06 6.80590208e+06] 中给出值。这是转换为浮点值的开销
    • @rnish:检查您的输入数据。我有:[0.00000000e+00 4.31655407e+08 9.49269260e+06 2.10608180e+06 4.43413700e+06 3.12821460e+06] 与 csv 结果完全一致。
    • 我需要检查一种将 ndarray 数据从科学计数法转换为浮点数的方法。 :-)。我提供的数据只是 csv 文件的一小部分
    • @rnish:数据是一样的。您可以随意打印它。要以 csv 格式保存数组:np.savetxt(sys.stdout, (mean,), fmt="%.1f", delimiter=", ") 您可以使用文件名或任何文件对象代替 `sys.stdout。
    【解决方案2】:

    您在空格处拆分 .cvs 文件 - 但您的字符串中没有空格。请尝试以逗号分隔:

        columns = f.readline().strip().split(',')
    

    【讨论】:

    • columns = f.readline().strip().split(',') numRows = 0 sums = [0] * len(columns) 这就是它的外观。但它不起作用。
    • 刚刚意识到-您还需要在 `values = line.split(" ")` 行中以逗号分隔行...将其更改为 ` values = line.split("," )`。这样更好吗?
    • 谢谢!。我没听懂。
    • 它忽略了 csv 文件的第一行。我不知道为什么。
    • 它会忽略第一行,因为您明确地读取了第一行(以获取 columns 列表),但随后不再使用它。尝试用sums = columns 替换初始化sums 的代码,你应该已经设置好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2018-06-08
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2023-03-31
    相关资源
    最近更新 更多