2016-09-15 3 views
0

저는 Python을 처음 접했습니다. 다른 불필요한 블록과 함께 다음 형식의 많은 데이터 블록을 포함하는 텍스트 파일이 있습니다.Python을 사용하여 텍스트 파일의 각 행 처리

NOT REQUIRED :: 123 
    Connected Part-1:: A ~$ 
    Connected Part-3:: B ~$   
    Connector Location:: 100 200 300 ~$ 
    NOT REQUIRED :: 456 
    Connected Part-2:: C ~$ 

는 전 정보 (파트 1 커넥터 위치에 연결된) 각각의 속성에 대응하는 (A, B, C (100) 200 (300))를 추출하고 나중에 그것을 사용하기 목록으로 저장하고자. 나는 파일을 읽고, 줄을 정리하고, 목록으로 저장하는 다음 코드를 준비했다. 여기

import fileinput 
    with open('C:/Users/file.txt') as f: 
    content = f.readlines() 
    for line in content: 
      if 'Connected Part-1' in line or 'Connected Part-3' in line: 
        if 'Connected Part-1' in line: 
          connected_part_1 = [s.strip(' \n ~ $ Connected Part -1 ::') for s in content]        
          print ('PART_1:',connected_part_1)         
        if 'Connected Part-3' in line: 
          connected_part_3 = [s.strip(' \n ~ $ Connected Part -3 ::') for s in content]        
          print ('PART_3:',connected_part_3)        
      if 'Connector Location' in line:       
        # removing unwanted characters and converting into the list 
        content_clean_1 = [s.strip('\n ~ $ Connector Location::') for s in content] 
        #converting a single string item in list to a string 
        s = " ".join(content_clean_1) 
        # splitting the string and converting into a list 
        weld_location= s.split(" ") 
        print ('POSITION',weld_location)  

은 내가 파일에 모든 문자로 구성된 문자열, 프로그램이 읽기되지는 '내용'때문에, 그 결론을 내릴 수를이 프로그램의 출력에서 ​​출력

PART_1: ['A', '\t\tConnector Location:: 100.00 200.00 300.00', '\t\tConnected Part-3:: C~\t'] 
    POSITION ['d', 'Part-1::', 'A', '\t\tConnector', 'Location::', '100.00', '200.00', '300.00', '\t\tConnected', 'Part-3::', 'C~\t'] 
    PART_3: ['1:: A', '\t\tConnector Location:: 100.00 200.00 300.00', '\t\tConnected Part-3:: C~\t'] 

입니다 개별 라인. 대신 모든 텍스트를 단일 문자열로 간주합니다. 누구든지이 경우에 도움을 줄 수 있습니까?

I 출력 다음과 같은 기대하고있다 :

PART_1: ['A'] 
    PART_3: ['C'] 
    POSITION: ['100.00', '200.00','300.00'] 

(주) 내가 데이터의 한 줄이 포함 된 개별 파일을 사용하고하면 잘 작동합니다. 그런 긴 질문에 대해 미안합니다

+0

'Connected Part-1'이 줄에 있거나 'Connected Part-3'이 줄에 있는지 확인하는 이유는 무엇입니까? '다음 중첩 된 if와 다시 확인 하시겠습니까? 왜''Connected Part-1 ''라인에''elif Connected Part-3''을''if/또는 if? –

답변

0

나는 분명히하려고 노력할 것이고, 나는 regex없이 그것을 어떻게 할 것인지를 보여줄 것입니다.

:

connected_part_1 = [s.strip(' \n ~ $ Connected Part -1 ::') for s in content] 

콘텐츠 당신이 같은 단순히 뭔가를하려는 생각, 전체 파일 라인이다 : 첫째, 제시된 코드의 가장 큰 문제는 string.strip 기능을 사용하는 경우 전체 콘텐츠 목록을 읽고있는 것입니다

connected_part_1 = [line.strip(' \n ~ $ Connected Part -1 ::')] 
조금 주관적이지만, 입력으로 게시 된 파일 형식을 지정하는 방법 파일을 구문 분석하는

, 나는 이런 식으로 할 것 :

templatestr = "{}: {}" 

with open('inputreadlines.txt') as f: 
    content = f.readlines() 
    for line in content: 
     label, value = line.split('::') 
     ltokens = label.split() 
     if ltokens[0] == 'Connected': 
      print(templatestr.format(
       ltokens[-1], #The last word on the label 
       value.split()[:-1])) #the split value without the last word '~$' 
     elif ltokens[0] == 'Connector': 
      print(value.split()[:-1]) #the split value without the last word '~$' 
     else: #NOT REQUIRED 
      pass 

당신이 할 수있는 string.strip 함수를 사용하여 예제에서와 같이 마지막 토큰을 제거하는 대신 재미있는 문자 '~ $'를 제거하십시오.

+0

: 감사합니다. 그러나 텍스트 파일의 키워드 (연결된 부품 -1, 커넥터 위치)를 비교하기위한 조건이 충족되지 않은 경우. 프로그램이 '졸음'을 실행 중입니다. 분명히 위의 코드에서 텍스트 파일에 언급 된 정확한 키워드를 사용했습니다. – makino

+0

그러나 나는 힌트를 얻었고, 더 일할 것이다. – makino

+0

그것은 @rll 감사했습니다. – makino

관련 문제