循环遍历整个文件python

时间:2017-07-07 18:19:02

标签: python for-loop input

我把这段代码放在一起:

flux =[31.,29,27.,25.]
F=[]
with open("results.rdx", "r") as file1:
for line in enumerate(file1):   
    f_list = [float(i) for line in file1 for i in line.split(',') if 
    i.strip()]
    F = f_list[7:11]
    with open("results.txt", "a+") as file2:
            file2.write(str(chisqfunc(flux,F)))
            file2.write("\n")

我的输入文件如下所示:

5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
1.053E-09, 1.839E-09, 1.632E-10, 1.959E-12, 4.109, 3.683, 3.586, 3.650 
5.0, 1000.0, 500000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
4.873E-09, 8.890E-09, 8.243E-10, 9.974E-12, 4.157, 3.704, 3.582, 3.649 
5.0, 1000.0, 1000000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
8.883E-09, 1.705E-08, 1.668E-09, 2.039E-11, 4.212, 3.731, 3.577, 3.648 

实际上有更多的线路,但是发布它是没有意义的。该函数进行了一些数组乘法等。我希望代码能做的是:读取第一行,将第7-10列的值附加到数组F[],调用chisqfunc并打印结果到文件results.txt。然后进入第二行,将新值附加到F等。 但它所做的只是从第2行开始,并对第2行执行上述过程,并仅打印第2行的值。 我怀疑问题与我宣布for的方式有关。 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

问题是你确实宣布你的循环的方式。特别是,您正在使用枚举函数,该函数返回(index, line)元组。您不会单独捕获索引,因此您无法获得所需的输出。

for line in file1:   
    F = list(map(float, map(str.strip, line.strip().split(','))))[7:11]
    ...

这是一种更好的方法,特别是如果您正在使用大型数字文件:使用numpy

In [84]: x = np.loadtxt('data.in', delimiter=',')

In [88]: F = x[:, 7:11]

In [89]: F
Out[89]: 
array([[  1.05300000e-09,   1.83900000e-09,   1.63200000e-10,
          1.95900000e-12],
       [  4.87300000e-09,   8.89000000e-09,   8.24300000e-10,
          9.97400000e-12],
       [  8.88300000e-09,   1.70500000e-08,   1.66800000e-09,
          2.03900000e-11]])

这里我假设您在发布的数据中手动添加了我删除的额外换行符以使其正常工作。 F包含所有行的必需数据。

答案 1 :(得分:-1)

enumerate返回值对:count,后跟给定iterable的元素。您的for语句忽略了文件的行:line只是一个从0到行的文件长度的计数器。

也许试试......

for line in file1:

此外,如果您的输入文件有3行而不是您显示的6行,请适当地编辑发布。否则,您的输入行甚至没有7:11的位置。