2011-08-26 4 views
0
import csv 
from math import sqrt 
import os 

class MaxiAverageCalculator(object): 
    def __init__(self): 
     self.ncols = 3 
     self.nrows = 0 
     self.s = [0.0, 0.0, 0.0] 
     self.s2 = [0.0, 0.0, 0.0] 

    def run(self, fullpath): 
     with open(fullpath, "rb") as infile: 
      reader = csv.reader(infile, delimiter=",") 
      self.colnames = list(next(reader)) 
      assert len(self.colnames) == 3 
      for row in reader: 
       L = [ float(x) for x in row ] 
       assert len(L) == 3 
       for i, x in enumerate(L): 
        self.s[i] += x 
        self.s2[i] += x * x 
       self.nrows += 1 
     self.avg = [x/self.nrows for x in self.s] 
     self.std = [ sqrt((y/self.nrows) - a * a) for a, y in zip(self.avg, self.s2) ] 
     print "Results for {0}".format(fullpath) 
     for name, a, s in zip(self.colnames, self.avg, self.std): 
      f.write(str(a)) 
      f.write(", ") 
      f.write(str(s)) 

     f.write("\n") 
##   print "{0}: avg = {1:.5f}, std = {2:.5f}".format(name, a, s) 
##  print 

if __name__ == "__main__": 
    path="A:\\yoyo\\heyy\\folder" 
    f=open("A\\yoy\\save.xls") 
    f.write("xavg, xstd, yavg, ystd, zavg, zstd") 
    f.write("\n") 
    dirList=os.listdir(path) 
    for file in dirList: 
     fullpath=os.path.join(path,file) 
     calc = MaxiAverageCalculator() 
     calc.run(fullpath) 

그래서 평균 및 x, y, z를 별도의 Excel 파일로 인쇄하려고합니다 ...이 스크립트는 온라인에 있습니다. 하지만 작동하지 않는 것 같아 ... 도와주세요파일, 파이썬 엑셀 인쇄

+0

"온라인에서이 스크립트를 얻었지만 작동하지 않는 것 같습니다."어떻게해야하는지에 대해 이해하고 있습니까? 이 사이트는 프로그램을 작성하는 사용자를위한 사이트입니다. 프로그램을 실행하려는 사람들을위한 사이트가 아닙니다. –

+1

@Temesgen Abba : 대답으로 생각한 방법을 게시하고 받아들이면 모든 사용자가 여기에 대한 답변을 찾는 데 도움이됩니다 – JMax

답변

1

여전히 플로피 디스크로 작업 할 수 있습니까? 와우 :-) 하나의 경로에서 "A:\\..."을 쓰고 다른 하나는 "A\\..."입니다. 아마 그럴거야.

외에도 명시 적으로 frun()으로 전달해야합니다. 그것은 더 나은 스타일입니다.

+0

xavg, xstd, yavg, ystd, zavg, zstd ....하지만 스크립트를 실행하면 xavg, xstd, ystd, zstd가 출력됩니다. –

+1

또한'f'를 닫습니다. –

0

당신이 할 때 :

for name, a, s in zip(self.colnames, self.avg, self.std): 
     f.write(str(a)) 
     f.write(", ") 
     f.write(str(s)) 

당신은 루프에서 쉼표 나 새로운 라인으로 다음 평균에서 이전의 표준 편차를 분리하지 않습니다. 당신의 평균이 [10, 20, 30]이고 표준 편차가 [1, 2, 3]라고 가정하십시오. 어떤 파일에 기록됩니다 것이 될 것입니다 :

10, 1, 20, 2, 30, 3

:

10, 120, 230, 3

당신이 원하는 경우 그때 추가 코드의 비트 (이 그것을 할 수있는 가장 좋은 방법이되지 않을 수도 있지만 그것은 작동) 말할 것 :

count = 0 
for name, a, s in zip(self.colnames, self.avg, self.std): 
     count += 1 
     f.write(str(a)) 
     f.write(", ") 
     f.write(str(s)) 
     if count < len(self.avg): # If it is not the last record 
      f.write(", ")   # Add a comma separating the std from the next avg 

을 또한 왜 루프에 모든 열 이름을 압축하는거야? 당신은 어디서나 그것을 사용하지 않습니다.