2017-02-18 4 views
0

저는 100 개가 넘는 .out 파일을 가지고 있습니다.이 파일은 MPlus라는 통계 소프트웨어의 출력 파일입니다. 텍스트의 수백 라인에서 (텍스트 편집기로 열 수 있습니다) 각 파일에, 나는에 관심이 라인의 몇 가지 있습니다 선들이 같이 -.>파이썬을 사용하여 텍스트 파일의 라인을 추출합니다.

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이 모든 파일에 있습니다.

이 출력 파일에서이 줄을 추출하여 파이썬 스크립트를 사용하여 단일 출력 파일에 던지려고합니다.

아직까지는, 내 메소드는 각 파일에서 행 수가 계속 변경되기 때문에 효율적이거나 효과적이지 않은 중첩 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 

에서 이러한 라인을 추출하는 가장 효율적이고 파이썬 방법입니다 무엇을 텍스트 파일?

편집 : 내가 관심있는 라인은 '헤더'뿐만 아니라 변수 + 값을 포함하는 라인입니다. 예를 들면. 나는 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() 
관련 문제