2017-07-07 56 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 

其實有辦法多行,但它是沒有意義的發佈一切。該函數執行一些數組乘法等。我希望代碼能做的是:讀取第一行,將列7-10的值附加到數組F[],調用chisqfunc並將結果打印到文件results.txt。之後進行到第二行,追加新的值F等 但它所做的是從第2行開始,並執行第2行的上述過程,並僅打印第2行的值。 我懷疑問題出在我宣佈的方式for。 任何幫助,不勝感激。

+1

請確保準確地重現您的縮進,特別是。當涉及到循環時。 – patrick

+1

爲什麼在索引7之前丟棄所有數字?只是好奇。 –

+0

你的邏輯是一個混亂,我建議從頭開始。 – Dan

回答

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包含所有行所需的數據。

+0

對於你寫的代碼,我仍然需要某種(for?)循環,這將調用陣列F中的每個單獨的4位數組,將其用作我的chisqfunc的參數,print結果,然後轉到下一個4位數組。 – George

+0

我想到的解決方案是在範圍()中使用'for i',但只適用於具有特定行數的特定文件。我想知道是否有更一般的東西。 – George

+0

@George你可以將它與方法1中的循環結合起來。對於方法2,你仍然需要一個循環。 –

-1

enumerate返回值對:一個count,後面跟着給定iterable的元素。您的for語句會忽略文件的行:line僅僅是一個從0到行中文件長度的計數器。

也許嘗試...

for line in file1: 

另外,如果你的輸入文件有3條線路,而不是你顯示6,請做適當修改的帖子。否則,你的輸入行甚至沒有位置7:11。