还有另一个列出csv文件的Python问题

时间:2011-07-27 22:06:56

标签: python csv

我有一个这种格式的文件csv文件,我想生成每一步的平均值:

elapsed,label
120,Step 01
260,Step 02
113,Step 03
100,Step 01
200,Step 02
103,Step 03

但我很难搞清楚这些清单。我使用的Python脚本是:

for file in sys.argv[1:]:
  for row in csv.DictReader(open(file)):
    label = row['label']
    elapsed = row['elapsed']
    print elapsed,label

我试过

label.append(row['elapsed'])label.append('elapsed'),但在每种情况下我都会收到此错误

AttributeError: 'str' object has no attribute 'append'

我不确定如何克服此错误。我是Python的新手,所以也许我在列表工作方式中遗漏了一些东西?如果我可以为步骤01得到像[120,100]这样的列表,我可以很容易地对它进行求和和平均,但它是我坚持的列表创建部分。

修改:result列表总和

现在,我有这个:

  for item in result:
    for n in result[item]:
      int(n)
      print sum(float(result[item][n]))

但是会收到此错误

TypeError: list indices must be integers, not str

但“n”已经是整数,没有......?或者这是指“项目”?我觉得我现在比以前更困惑了。

3 个答案:

答案 0 :(得分:3)

我相信这应该实现你正在尝试的目标:

result = dict()
for file in sys.argv[1:]:
  for row in csv.DictReader(open(file)):
    label = row['label']
    elapsed = float(row['elapsed'])
    if label in result:
      result[label].append(elapsed)
    else:
      result[label] = [elapsed]

totals = dict((label, sum(values)) for label, values in result.iteritems())

执行此操作后,result将包含您想要的格式的列表。

答案 1 :(得分:2)

如果你想要的是制作清单,

from collections import defaultdict
steps = defaultdict(list)

for file in sys.argv[1:]:
  for row in csv.DictReader(open(file)):
    steps[row['label']].append(row['elapsed'])

averages = dict((key, sum(value)) for key, value in steps.iteritems())

会给你平均值。

您正在尝试将row['elapsed']中的字符串添加到label中的字符串中,但字符串是不可变的,因此无法追加。您可以使用string1 + string2或`''。join((string1,string2))加入它们。

编辑:此外,对于您的新错误,请参阅我的代码的最后一行,或者尝试:

averages = {}
for item in result.iteritems():
    print item[0], sum(item[1])

答案 2 :(得分:0)

(代表问题作者发布的解决方案)

非常感谢@ Pablo,@ agf和@ ms4py。您的意见使我想到了这一点。

result = dict()
av = []
idx = []
for file in sys.argv[1:]:
  for row in csv.DictReader(open(file)):
    label = row['label']
    elapsed = row['elapsed']
    if label in result:
      result[label].append(elapsed)
    else:
      result[label] = [elapsed]    
  for i in sorted (result.iterkeys()):
    s = sum(int(v) for v in result[i])
    a = s/float(len(result[i]))