-1
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

私が得るエラーは次のとおりです。

File "C:\Users\konrad\Desktop\exp\trail3.py", line 11, in averager
    avgr+=str((avg[x[i]]))
TypeError: 'int' object has no attribute '__getitem__'
4

5 に答える 5

2

xは単なる整数であるため、インデックスを作成できません。

したがって、この:

x[i]

決して働かないでください。それがエラーが訴えていることです。

アップデート

コードを簡素化する方法についての推奨事項を求めたので (以下のコメントで)、次のようになります。

CSV ファイルが次のようになっているとします。

-9,2,12,90...
1423,1,51,-12...
...

次のようにファイルを読み取ることができます。

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

を使用したことに注意してください.split('\n')。これにより、ファイルの内容がファイル内のfile_lines行のリストとして保存されます。

したがって、ith 列を合計したい場合、これは内包表記で簡単に実行できます。

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

したがって、すべてを平均化するには、合計を行数で割るだけです。

average = ith_col_sum / len(file_lines)
于 2013-05-01T04:04:49.010 に答える
1

他の人があなたのエラーの根本原因を指摘しています。メソッドを記述する別の方法を次に示します。

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)
于 2013-05-01T04:23:13.580 に答える
0

OPがコメントの1つでこれについてどのように対処すべきかを尋ねるのに応えて、ここに私の提案があります:

import csv
from collections import defaultdict    
with open('numcsv.csv') as f:
    reader = csv.reader(f)
    numbers = defaultdict(list) #used to avoid so each column starts with a list we can append to
    for row in reader:
        for column, value in enumerate(row,start=1):
            numbers[column].append(float(value)) #convert the value to a float 1. as the number may be a float and 2. when we calc average we need to force float division
    #simple comprehension to print the averages: %d = integer, %f = float. items() goes over key,value pairs
    print('\n'.join(["Column %d had average of: %f" % (i,sum(column)/(len(column))) for i,column in numbers.items()]))

生産

>>> 
Column 1 had average of: 2.400000
Column 2 had average of: 2.000000
Column 3 had average of: 1.800000

ファイルの場合:

1,2,3
1,2,3
3,2,1
3,2,1
4,2,1
于 2013-05-01T04:29:38.447 に答える
0

ここでは 2 つの方法を示します。最初のものは、行の平均を取得するだけです (上記のコードが実行しているように見えます)。2番目は列の平均を取得します(これはあなたの質問が尋ねたものです)

''' This just gets the avg for a line'''
def averager(filename):
  f=open(filename, "r")
  avg = f.readlines()
  f.close()

  count = 0
  for i in xrange(len(avg)):
    count += len(avg[i])

  return count/len(avg)

''' This gets a the avg for all "columns"
char is what we split on , ; | (etc)
'''
def averager2(filename, char):
  f=open(filename, "r")
  avg = f.readlines()
  f.close()

  count = 0 # count of items
  total = 0 # sum of all the lengths
  for i in xrange(len(avg)):
    cols = avg[i].split(char)
    count += len(cols)
    for j in xrange(len(cols)):
      total += len(cols[j].strip()) # Remove line endings

  return total/float(count)
于 2013-05-01T04:39:33.957 に答える