为什么不返回CSV文件列的平均值?

2024-10-01 09:17:45 发布

您现在位置:Python中文网/ 问答频道 /正文

def averager(filename):
    f=open(filename, "r")
    avg=f.readlines()
    f.close()
    avgr=[]
    final=""
    x=0
    i=0
    while i < range(len(avg[0])):
        while x < range(len(avg)):
            avgr+=str((avg[x[i]]))
            x+=1
        final+=str((sum(avgr)/(len(avgr))))
        clear(avgr)
        i+=1
    return final

我得到的错误是:

^{pr2}$

Tags: closelendefrangeopenfilenamefinalavg
3条回答

其他人已经指出了你错误的根本原因。以下是编写方法的另一种方法:

def csv_average(filename, column):
    """ Returns the average of the values in
        column for the csv file """

    column_values = []

    with open(filename) as f:
        reader = csv.reader(f)
        for row in reader:
            column_values.append(row[column])

    return sum(column_values) / len(column_values)

让我们来看看这个代码:

def averager(filename):

averager作为一个名称并没有像它可能的那样清晰。例如,averagecsv怎么样?在

^{pr2}$

avg名称不正确。这不是所有事情的平均值!是一堆台词。例如,将其称为csvlines。在

    f.close()
    avgr=[]

avgr名称不正确。它是什么?名字应该有意义,否则为什么要给他们?在

    final=""
    x=0
    i=0
    while i < range(len(avg[0])):
        while x < range(len(avg)):

如注释中所述,可以用for循环替换它们,如for i in range(len(avg[0])):。这样您就不必声明和增加有问题的变量。在

            avgr+=str((avg[x[i]]))

嗯?让我们把这条线拆开。在

名称不好的avg是csv文件中的行。在

所以,我们用x索引avg,好的,这将给我们一个行号x。但是。。。x[i]没有意义,因为x是一个整数,整数不支持数组访问。我想你想做的是。。。将文件拆分为行,然后将行拆分为列,因为它是csv。正确的?在

所以我们把代码扔了吧。使用split http://docs.python.org/2/library/stdtypes.html#str.split函数,您需要这样的结果:

totalaverage = 0
for col in range(len(csvlines[0].split(","))):
    average = 0
    for row in range(len(csvlines)):
        average += int(csvlines[row].split(",")[col])
    totalaverage += average/len(csvlines)
return totalaverage

但是等等!还有更多!Python有一个内置的csv解析器,它比使用,进行拆分更安全。看看这里:http://docs.python.org/2/library/csv.html

x只是一个整数,因此无法对其编制索引。在

所以,这个:

x[i]

永远都不会有用。这就是错误所抱怨的。在

更新

既然您询问了如何简化代码的建议(在下面的注释中),下面是:

假设您的CSV文件类似于:

^{pr2}$

您可以这样读取文件:

with open(<filename>, 'r') as file_reader:
    file_lines = file_reader.read().split('\n')

注意,我使用了.split('\n')。这会导致文件的内容存储在file_lines中,同时也是文件中的行列表。在

因此,假设您希望对第i列进行求和,这很容易通过理解来完成:

ith_col_sum = sum(float(line.split(',')[i]) for line in file_lines if line)

因此,要求出所有的平均值,你可以将总和除以行数:

average = ith_col_sum / len(file_lines)

相关问题 更多 >