我正在尝试解决以下问题:
完成函数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
答案 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
可能不是正确的类型。您可能需要float
或decimal.Decimal
。有关详情,请参阅教程中的Numbers。
你不仅应该打印出每个名字和行总和,你应该把它们放在字典中并返回该字典。你通过d[key] = value
将字符放入字典中,所以希望你能弄清楚如何将名字和行总和放入d
。然后最后只有return d
。
由于某种原因,header=False
参数必须在那里。我的猜测是你应该用它让呼叫者指定是否有跳过标题行,而不是你总是跳过标题行无论如何。所以,你需要一个if header:
某处。
*这仅适用于Python 3.x,但这就是您似乎正在使用的内容。如果你不是,你可能使用2.7,迭代器做有一个next
方法,但你仍然不应该调用它。