2017-07-07 16 views
-2

を通じて私は一緒にコードのこの部分を入れている:ループは、ファイル全体パイソン

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 

は実際の方法多くの行がありますが、それは無意味ですすべてを投稿する関数はいくつかの配列の乗算などを行います。最初の行を読み、配列F[]に列7-10の値を追加し、chisqfuncを呼び出してその結果をファイルresults.txtに出力します。その後、2行目に進み、新しい値をFなどに追加します。 しかし、それは2行目から始まり、2行目について上記の手順を実行し、2行目の値のみを出力します。 問題があると思われます私がforと宣言した通りです。 何か助けていただければ幸いです。

+1

くぼみを正確に再現してください。ループが関係しているとき。 – patrick

+1

なぜインデックス7より前にすべての数値を破棄していますか?ちょっと興味があるんだけど。 –

+0

あなたはロジックが混乱していることをお勧めします。 – Dan

答えて

2

問題は、実際にあなたのループを宣言した方法です。特に、(index, line)タプルを返す列挙関数を使用しています。索引は別々には取得しないので、探している出力が得られません。使用numpy

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

は、ここでは、数字の大きいファイルで作業している場合は特に、これを行うためのより良い方法です。

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には、すべての行に必要なデータが含まれています。

+0

あなたが書いたコードのために、私はまだいくつかの種類の?ループを必要とします、それは配列Fの中の個々の4桁の配列を呼び出すでしょう、私のchisqfunc、その結果を次の4桁の配列に移動します。 – George

+0

私が考えた解決策は 'for i in range()'を使用することですが、それはその特定の行数の特定のファイルに対してのみ有効です。私はもっ​​と一般的なものがあるのだろうかと思っていた。 – George

+0

@Georgeこれをアプローチ1のループと組み合わせることができます。アプローチ2では、ループが必要です。 –

-1

enumerateは、値のペアを返します。countには、指定されたiterableの要素が続きます。 forステートメントは、ファイルの行を無視します。lineは、単に0からファイル内の行までのカウンターです。

おそらくまた

for line in file1: 

...してみてください、あなたの入力ファイルは3行ではなく、あなたが表示さ6を持っている場合は、適切な投稿を編集してください。それ以外の場合は、入力行に7:11の位置も含まれません。

関連する問題