【问题标题】:TypeError: 'float' object is not iterable 3TypeError: 'float' 对象不可迭代 3
【发布时间】:2014-08-13 13:30:41
【问题描述】:
import csv

csvfile = open(r"C:\Users\Administrator\Downloads\canberra_2011_2012.csv")

header = csvfile.readline()  
csv_f = csv.reader(csvfile)   
for row in csv_f:
    first_value = float(row[5]) 
    total = sum(first_value)
    length = len(first_value)
    average = total/length
    print("average = ",average)   

当我运行这段代码时,它说

TypeError: 'float' object is not iterable

但是当我将第 7 行更改为

first_value = [float(row[5]) for row in csv_f

然后就可以了。这让我很困惑,有人可以帮助我吗?

【问题讨论】:

  • 这是什么编程语言?
  • 您希望sum(first_value) 产生什么?实际上,您正在尝试将在每行的第 6 列中找到的单个值单独相加。缩进的代码为电子表格中的每一行单独运行一次。
  • 这是python,我该如何解决?
  • 您的列表理解已经修复了它,不是吗?您的sumlen 都假定first_value 是一个值列表,而不是单个值。让它实际上是一个值列表(可能有一个更好的名字)修复它。
  • 如果我使用 first_value = [float(row[5]) for row in csv_f],它确实修复了它。但是求平均值只是任务一,在任务二中,它要求我找到 2011 年和 2012 年的平均值。这个文件的第三列是年份,所以我打算测试第 3 列中的值何时等于2011,然后输出第6列的值,但是输出的是“[]”,没有任何值

标签: python csv


【解决方案1】:

另一个答案比我的要优雅得多,但以下更接近您原始代码的精神。它可能会使您的错误更加明显。我为糟糕的格式道歉。我是这个网站的新手。

import csv
csvfile = open(r"C:\Users\Administrator\Downloads\canberra_2011_2012.csv")

header = csvfile.readline()  
csv_f = csv.reader(csvfile)
length = 0
total = 0.0   
for row in csv_f:
    first_value = float(row[5])
    total = total + first_value
    length += 1
if length > 0:
    average = total/length
    print("average = ",average)   

【讨论】:

    【解决方案2】:

    我想你想收集所有的first_values 然后做一些计算。为此,您必须遍历 csv 文件的每一行并首先收集所有值,否则您将求和一个值,这就是错误的根源。

    试试这个版本:

    import csv
    
    
    with open(r"C:\Users\Administrator\Downloads\canberra_2011_2012.csv") as f:
        reader = csv.reader(f)
        values = [float(line[5]) for line in reader]
    
    # Now you can do your calculations:
    
    total = sum(values)
    length = len(values)
    # etc.
    

    【讨论】:

    • 谢谢,我会再试一次
    【解决方案3】:

    您在这行代码中遇到此错误,

    total = sum(first_value)
    

    引发错误是因为 sumfunctioniterable 对象。在您的代码中,first_value 是一个 float 对象。所以你不能在上面使用sum函数。但是当你使用列表压缩时,

    first_value = [float(row[5]) for row in csv_f]
    

    那么first_value 是一个list 类型对象,由row[5]float 值组成。所以你可以在它上面应用sum 函数而不会引发错误。

    除了列表压缩之外,您还可以在for 循环中附加列表中的值,并在循环后计算sumlength

    first_values = []
    for row in csv_f:
        first_value = float(row[5])
        first_values.append(first_value)
    
    total = sum(first_values)
    length = len(first_values)
    average = total/length    
    

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2015-10-23
      • 2020-09-26
      • 1970-01-01
      • 2020-03-19
      • 2018-06-21
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多