【问题标题】:Loop through entire file python循环遍历整个文件python
【发布时间】:2017-07-07 18:19:01
【问题描述】:

我整理了这段代码:

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 的方式上。 非常感谢任何帮助。

【问题讨论】:

  • 请确保准确地复制您的缩进,尤其是。当涉及循环时。
  • 为什么要丢弃索引 7 之前的所有数字?只是好奇。
  • 你的逻辑一团糟,我建议重新开始。
  • OP,你安装了 numpy 吗?
  • @patrick 抱歉,我错过了。

标签: python for-loop input


【解决方案1】:

确实,问题在于您声明循环的方式。特别是,您正在使用 enumerate 函数,它返回一个 (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 包含所有行所需的数据。

【讨论】:

  • 对于您编写的代码,我仍然需要某种 (for?) 循环,它将调用数组 F 中的每个单独的 4 位数组,将其用作我的 chisqfunc 的参数,打印结果,然后转到下一个 4 位数组。
  • 我想到的一个解决方案是使用'for i in range()',但这仅适用于具有特定行数的特定文件。我想知道是否有更一般的东西。
  • @George 您可以将其与方法 1 中的循环结合使用。对于方法 2,您仍然需要一个循环。
  • 还有使用列表推导的选项,但实际上并不重要。
【解决方案2】:

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

或许可以试试……

for line in file1:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2019-01-03
    • 2018-01-15
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多