2017-02-18 55 views
0

我有超過100個.out文件,這些文件是來自統計軟件MPlus的輸出文件。在每個文件(可以用任何文本編輯器打開),從幾百行文字中,有一對夫婦,我很感興趣線的線條看起來像這些 - >使用python從文本文件中提取行

I  ON 
    K1    -0.247  0.321  -0.769  0.442 
    K2     0.161  0.232  0.696  0.486 

S  ON 
    K1     0.035  0.143  0.247  0.805 
    K2    -0.123  0.154  -0.799  0.424 

Q  ON 
    K1     0.083  0.325  0.255  0.798 
    K2     0.039  0.229  0.169  0.866 

I  ON 
    LABTOTF1   0.014  0.018  0.787  0.431 
    LABTOTG2   0.011  0.017  0.626  0.532 
    UGLABTOT   0.001  0.004  0.272  0.786 
    UMLABTOT   0.098  0.147  0.664  0.507 

S  ON 
    LABTOTF1   -0.008  0.019  -0.406  0.684 
    LABTOTF2   0.000  0.013  -0.018  0.986 
    UGLABTOT   -0.001  0.003  -0.209  0.835 
    UMLABTOT   -0.063  0.115  -0.548  0.584 

Q  ON 
    LABTOTF1   -0.013  0.025  -0.532  0.595 
    LABTOTF2   -0.014  0.023  -0.596  0.551 
    UGLABTOT   0.007  0.006  1.131  0.258 
    UMLABTOT   -0.489  0.171  -2.859  0.004 

數字不斷變化,變量(K1,K2,LABTOTF1等)和變量數量通過文件保持不斷變化。但是I ON,S ON,Q ON存在於所有文件中。

我想從這些輸出文件中提取這些行,並使用python腳本將它們放入單個輸出文件中。

至今爲止,我的方法包括編寫嵌套for循環,既不是有效的,也不是有效的,因爲每行文件中行數不斷變化。

我的第一個可怕的「測試」在想起來的線I ON和值(K1 & K2)嘗試使用下面的代碼行:

file = open("./my_folder/my_file.out","r") 
lines = [line for line in file] 
file.close() 
collector = [] 
for i in range(0,len(lines)): 
    if lines[i] == '\n': 
     continue 
    elif "I  ON\n" in lines[i]: 
     collector.append(lines[i]) 
     collector.append(lines[i+1]) 
     collector.append(lines[i+2]) 
     i += 4 
     continue 

什麼是提取這些線的最有效和最Python的方式一個文本文件?

編輯:我感興趣的行是'標題'以及包含變量+值的行。例如。如果我想的I ON部分,我想從前面的例子中拉下面幾行:

I  ON 
    K1    -0.247  0.321  -0.769  0.442 
    K2     0.161  0.232  0.696  0.486 

回答

0

假設這是該文件的結構:

out_lines = [] 
for line in lines: 
    if len(line.strip().split()) == 2: 
     out_lines.append(line) 
+0

對不起,看起來我不清楚我的問題。更新它以顯示我有興趣拉什麼線。 –

+0

你可以很容易地擴展我的例子。只需將每行添加到'out_lines',並且如果第二行('if len(line.strip()。split())== 2')的條件爲真,則「flush」該行列表並開始新的一個。 –

+0

嗨Shachar,不會工作的原因是因爲缺乏特異性。如果文本中有另一行只有兩個單詞,那麼它也會附加到輸出變量中。 –

0

你可以使用正則表達式,如果你想搜索確切的關鍵結構。以下代碼僅適用於一個'.out'文件,併爲上述測試數據的每種標題類型生成一個文件。

import re 
file_path = 'E:\\' # the path to the folder with the .out file 
file_name = 'test.out' 

# for multiple files, insert create a loop for the section below. 
with open(file_path + file_name, 'r') as f: 
    line_keys = f.readline() 
    while line_keys: # If it is not empty 
     key_search = re.search(' ?[ISQ]\s*ON', line_keys) # search for the key pattern 
     if key_search is not None: # If a match is found 
      file_output = line_keys[1:2] + '.txt' 
      with open(file_path + file_output, 'a') as f_out: 
       f_out.write(line_keys) # If you repeatedly want the heading of each section 
       while True: # Read the subsequent lines 
        lines_data = f.readline() 
        if lines_data == "\n": 
         break 
        if lines_data == "": 
         break 
        f_out.write(lines_data) 
       f_out.write('\n') # to separate the different sections by a blank line 
     line_keys = f.readline()