在python中读取CSV文件并对行中的值求和

时间:2014-11-26 23:20:11

标签: python csv

我正在尝试解决以下问题:

  

完成函数sumRows,使其读取此格式的文件   并返回一个字典,其键指定名称及其值   是相应行中的数值之和。例如,   上面的记录将导致输入'dave':14.0。空或   应该是非数字字段(第一列中的名称除外)   被忽略了。

下面的代码尝试似乎并没有起作用,我不确定我是否完全理解这个问题。

def sumRows(filename, header=False):
    d ={}
    with open(filename) as csvfile:
        headerline = csvfile.next()
        total = 0
        for row in csv.reader(csvfile):
            total += int(row[1])
        print(total)

用于csv文件

  

rows1

     

戴夫,3,5,6-
  蒂娜,12,3,5

1 个答案:

答案 0 :(得分:1)

代码中的第一个问题是:

headerline = csvfile.next()

Python中的迭代器(文件,CSV读取器等)没有next方法。*有一个next function将迭代器作为参数,如下所示:

headerline = next(csvfile)

如果我解决了这个问题,你的代码会打印出第二列中所有值的总和。

但你应该总结,而不是

要解决此问题,您需要迭代每行的列:

    for row in csv.reader(csvfile):
        rowtotal = 0
        for column in row[1:]:
            rowtotal += int(column)
        print(row[0], rowtotal)    

现在我们越来越近了,但你仍然需要解决四个问题。

  • “应忽略空或非数字字段”,但您的代码不会这样做,它会引发ValueError。因此,您需要try将每列转换为int,并以适当的方式处理可能的ValueError

  • 该问题询问“数字”,而不是“整数”,并以14.0为例。所以int可能不是正确的类型。您可能需要floatdecimal.Decimal。有关详情,请参阅教程中的Numbers

  • 你不仅应该打印出每个名字和行总和,你应该把它们放在字典中并返回该字典。你通过d[key] = value将字符放入字典中,所以希望你能弄清楚如何将名字和行总和放入d。然后最后只有return d

  • 由于某种原因,header=False参数必须在那里。我的猜测是你应该用它让呼叫者指定是否有跳过标题行,而不是你总是跳过标题行无论如何。所以,你需要一个if header:某处。


*这仅适用于Python 3.x,但这就是您似乎正在使用的内容。如果你不是,你可能使用2.7,迭代器有一个next方法,但你仍然不应该调用它。