2015-04-25 26 views
0

所以这段代码应该打开csv文件,从列1-3(而不是0)获取值。一旦它获得了每行和3列的值,它应该将这些值加起来并除以3.我认为这段代码可以工作,但是在每行中添加3列看起来并没有工作。如果有人能告诉我为什么以及如何解决这个问题,那会很棒,谢谢。我非常确定问题在于for index, summedValue in enumerate (sums):具体来说,是“summedValue”值。需要帮助了解为什么这个值保持为1? Python CSV

if order ==("average score"): 
    askclass = str(input("what class?")) 
    if askclass == ('1'): 
      with open("Class1.csv") as f: 
       columns = f.readline().strip().split(" ") 
       sums = [1] * len(columns) 

       for line in f: 
        # Skip empty lines 
        if not line.strip(): 
         continue 

        values = line.split(" ") 
        for i in range(1,len(values)): 
         sums[i] += int(values[i]) 

       for index, summedValues in enumerate (sums):  
        print (columns[index], 1.0 * (summedValues)/3) 
+0

还有缩进问题 – valentin

+0

@valentin感谢评论,请问具体在哪里? –

+0

@CallumHemsley,完全按照你在本地的地方添加你的代码。因为它不是它甚至不会运行 –

回答

0
from statistics import mean 
import csv 

with open("Class1.csv") as f: 
    # create reader object 
    r = csv.reader(f) 
    # skip headers 
    headers = next(r) 
    # exract name from row and use statistics.mean to average from row[1.. 
    # mapping scores to ints 
    avgs = ((row[0], mean(map(int, row[1:]))) for row in r) 
    # unpack name and average and print 
    for name, avg in avgs: 
     print(name,avg) 

什么,除非你已经写空行到您的CSV文件有赢不是任何人,不知道标头如何适应它,但如果有必要,你可以使用它。

您也可以解开与*语法在Python 3我认为这是更好一点:

avgs = ((name, mean(map(int, row))) for name, *row in r) 
for name, avg in avgs: 
    print(name,avg) 

如果只想排序平均利用反向= true来排序,从最高到最低阶:

from statistics import mean 
import csv 
from operator import itemgetter 

with open("Class1.csv") as f: 
    r = csv.reader(f) 
    avgs = sorted(((name, mean(map(int, row))) for name, *row in r),key=itemgetter(1),reverse=True) 
    for name, avg in avgs: 
     print(name,avg) 

传递key=itemgetter(1)意味着我们按每个元组中平均值的第二个子元素进行排序。

+0

非常感谢您的支持,它的效果非常好,但它似乎忽略了我的第一排结果。不管怎样,谢谢你! –

+0

@CallumHemsley,那么你的文件没有标题,'headers = next(r)'跳过第一行,如同'columns = f.readline()。strip()。split(“”)',如果你没有有一个标题只是删除下一个电话 –

+0

,这是非常有道理的,不能形容这是多么感激。 –

0

使用

1, 2, 3 
4, 2, 3 
4, 5, 3 
1, 6, 3 
1, 6, 6 
6, 2, 3 

如Class1.csv 和

askclass = str(input("what class?")) 
if askclass == ('1'): 
    with open("Class1.csv") as f: 
    columns = f.readline().strip().split(",") 
    sums = [1] * len(columns) 
    for line in f: 
     # Skip empty lines 
     if not line.strip(): 
     continue 
     values = line.split(",") 
     for i in range(1,len(values)): 
     sums[i] += int(values[i]) 
for index, summedValues in enumerate (sums): 
    print (columns[index], 1.0 * (summedValues)/3) 

我获得预期的结果:

what class?1 
('1', 0.3333333333333333) 
(' 2', 7.333333333333333) 
(' 3', 6.333333333333333) 

[更新]观察:

  1. 总和定义广告sums = [1] * len(columns)具有长列,但你忽略了你的操作第一列所以和值[0]永远是1,不要似乎有必要。
  2. 浮法师就足以summedValues/3.0而不是1.0 * (summedValues)/3

也许这是你想要

for line in f: 
    # Skip empty lines 
    if not line.strip(): 
     continue 

    values = line.split(" ") 
    for i in range(1,len(values)): 
     sums[i] += int(values[i]) 

for index, summedValues in enumerate (sums):  
    print (columns[index], 1.0 * (summedValues)/3) 
+0

我刚刚将这个复制到我的本地代码中,并没有改变一件事,谢谢你的贡献。 [更新] - 我已经改变了你对第二点的观察,但是我会为第一点改变什么? –

相关问题