2013-11-03 42 views
0

我如何使用循环来做同样的事情,使程序更高效,而不是蛮力?Python 3.2:带循环的文件输入/输出

我想读取文件中的值,将它们转换为浮点数,取前三个数字的平均值,将平均值写入一个新文件,并继续处理接下来的三个数字。

例子:

原始文件:

20.1 
18.2 
24.3 
16.1 
45.5 
42.3 
46.1 
43.8 
44.4 

新文件:

20.87 
19.53 
28.63 
34.63 
44.63 
44.07 
44.77 

这是我的代码:

def smooth(rawDataFilename, smoothDataFilename): 
    aFile = open(rawDataFilename, 'r') 
    newFile = open(smoothDataFilename, 'w') 

    num1 = float(aFile.readline()) 
    num2 = float(aFile.readline()) 
    num3 = float(aFile.readline()) 
    num4 = float(aFile.readline()) 

    smooth1 = (num1 + num2 + num3)/3 
    smooth2 = (num2 + num3 + num4)/4 

    newFile.write(str(format(smooth1, '.2f'))) 
    newFile.write('/n') 
    newFile.write(str(format(smooth2, '.2f'))) 

    aFile.close() 
    newFile.close() 
+0

会发生什么,什么不? – glglgl

+2

你在寻找移动平均数,还是每组3的平均值?你的问题和你的数字说了两件不同的事情。 – ratatoskr

回答

1

我会解决你的任务与循环:

def smooth(rawDataFilename, smoothDataFilename): 
    data = [] 
    with open(rawDataFilename, 'r') as aFile, open(smoothDataFilename, 'w') as newFile: 
     for line in aFile: 
      num = float(line) 
      data.append(num) 
      if len(data) >= 3: 
       smooth = sum(data)/len(data) 
       newFile.write(format(smooth, '.2f') + '\n') 
       del data[0] 

差异,以您的解决方案:

  • with需要照顾的文件的清理结束,甚至在错误
  • 我用一个列表收集数据和平滑
  • 我把换行符之间的数字而不是序列/n

我想你想移动平均e代表您的代码,而不是您的文本所暗示的三元组平均值。

0

如果你的任务是把每组三个数字从线的平均值,这里的东西,正是这么做的:

from itertools import izip 

with open('somefile.txt') as f: 
    nums = map(float, f) 

with open('results.txt', 'w') as f: 
    for i in izip(*[iter(nums)]*3): 
     f.write('{0:.2f}\n'.format(sum(i)/len(i))) 

izip是从grouper recipie从itertools。不过,我怀疑你根据你的实际结果需要别的东西。我希望这会让你走。