2017-10-05 3 views
0

다른 프로그램에서 생성 된 로그 파일 (XML)을 가져 오는 Python 프로그램을 작성 중이며 그 파일에서 데이터를 읽습니다. 내가 원하는 정보를 콘솔에 출력하거나 다른 파일에 쓰십시오. 나는 사이의 모든 정보를 읽을 수Python- 특정 값을 갖는 두 줄 사이에서 파일을 한 줄씩 읽는 방법

2017-05-01 00:00:24 [Client/Report Report] INFO  {'message-id': 'ID:ELX-LVL-ETL01-50079-1493596823959-1:1:1:1:1', 'expires': '1493640024119', 'type': 'MID', 'persistent': 'true', 'destination': '/topic/bmrsTopic', 'timestamp': '1493596824119', 'subscription': 'TtJXJBbtEOcpLrjDsbFD', 'priority': '4'} 
<?xml version="1.0" encoding="utf-8"?> 
<msgGrp> 
    <pubTs>2017-05-01 00:00:24:GMT</pubTs> 
    <flow>MID</flow> 
<msg> 
    <subject>BMRA.SYSTEM.MID</subject> 
<row> 
    <MI>APXMIDP</MI> 
    <SD>2017-05-01 00:00:00:GMT</SD> 
    <SP>2</SP> 
    <M1>30.620</M1> 
    <M2>456.3000</M2> 
</row> 
</msg> 
</msgGrp> 

2017-05-01 00:00:39 [Client/Report Report] INFO  {'message-id': 'ID:ELX-LVL-ETL01-59269-1493596838709-1:1:1:1:1', 'expires': '1493640039019', 'type': 'NONBM', 'persistent': 'true', 'destination': '/topic/bmrsTopic', 'timestamp': '1493596839019', 'subscription': 'TtJXJBbtEOcpLrjDsbFD', 'priority': '4'} 
<?xml version="1.0" encoding="utf-8"?> 
<msgGrp> 
    <pubTs>2017-05-01 00:00:38:GMT</pubTs> 
    <flow>NONBM</flow> 
<msg> 
    <subject>BMRA.SYSTEM.NONBM</subject> 
    <TP>2017-05-01 00:00:00:GMT</TP> 
<row> 
    <SD>2017-05-01 00:00:00:GMT</SD> 
    <SP>2</SP> 
    <NB>0</NB> 
</row> 
</msg> 
</msgGrp> 

2017-05-01 00:00:41 [Client/Report Report] INFO  {'message-id': 'ID:ELX-LVL-ETL01-35161-1493596840568-1:1:1:1:1', 'expires': '1493640040868', 'type': 'INDO', 'persistent': 'true', 'destination': '/topic/bmrsTopic', 'timestamp': '1493596840868', 'subscription': 'TtJXJBbtEOcpLrjDsbFD', 'priority': '4'} 
<?xml version="1.0" encoding="utf-8"?> 
<msgGrp> 
    <pubTs>2017-05-01 00:00:40:GMT</pubTs> 
    <flow>INDO</flow> 
<msg> 
    <subject>BMRA.SYSTEM.INDO</subject> 
<row> 
    <TP>2017-05-01 00:00:00:GMT</TP> 
    <SD>2017-05-01 00:00:00:GMT</SD> 
    <SP>2</SP> 
    <VD>21627.000</VD> 
</row> 
</msg> 
</msgGrp> 

:

내가 읽는 오전 로그 파일은 다음과 같은 특정 형식으로 기록 된 데이터 (로그의 수를) 포함 각각 <msgGrp> & </msgGrp> 태그 (즉, 실제 XML)를 추가하고 String에 추가 한 다음 XML 트리로 변환합니다.

저는 이것을 수행하기 위해 파이썬 스크립트를 작성하기 시작했으며 일부 정보를 올바르게 읽어야합니다. 지금은 두 XML 태그 사이의 모든 것을 읽고 문자열에 추가하려고하지만,이 작업을 수행하는 방법을 알 수는 없습니다 ... 내 파이썬 프로그램은 현재 다음과 같이 보입니다 :

with open("logFile") as file: 
    for line in file: 
     if(line.startswith('2017')): 
      # Do something 
      # Display some output in the console 
     elif(line.startswith('<?xml')): 
      # Do something else 
      # Display some output in the console 
     elif(line.startswith('<msgGrp>')): 
      xmlString = ""; 
      while(not(line.startswith('</msgGrp>'))): 
       xmlString += line; 
      # Display some output in the console 
     else: 
      # Do something else 

나는 시도하고이 스크립트를 실행, 콘솔 출력을 보여줍니다 성공적으로 첫 if & elif 실행 (내가 그들의 디버그 콘솔에 표시 얻을),하지만이 두 번째 elif (즉, 하나에 실행될 때 현재 XML 태그 내의 데이터를 읽으려고하고 있습니다.) 콘솔은 잠시 동안 아무 것도하지 않는 것처럼 잠시 멈추는 것처럼 보입니다. 결국

이라는 메시지가 표시됩니다.

사망

내가 그 태그 사이의 라인을 읽고 변수 xmlString로를 추가, (즉, 동안 메모리 또는 뭔가 부족 있기 때문에 이것이 같은데요 두 번째 코드 내의 elif) ...?

아무도 내가 여기서 잘못하고있는 것을 설명 할 수 있습니까? 프로그램에서 지정한 두 태그 사이의 정보 만 성공적으로 읽도록하고 그 변수를 내가 만든 변수 xmlString에 추가하려면 어떻게해야합니까? 컴퓨터의 모든 메모리를 먹고, 무한 루프 (line이 아니라 while 루프에서, 외부 루프에서 수정)의

답변

2
while(not(line.startswith('</msgGrp>'))): 
     xmlString += line; 

.

논리가 여기에서 깨졌습니다. 당신은 태그의 시작을 발생 때 플래그를 설정하고 메인 루프 태그 이 끝날 때까지 축적한다, 로직과 같은 몇 가지 :

elif(line.startswith('<msgGrp>')): 
     start = True 
     xmlString = "" 

    elif(line.startswith('</msgGrp>'))): 
     start = False 

    if start: 
     xmlString += line 

참고 : 이미 나쁜

  • 를 연결하는 더 나은 사용 io.StringIO 또는 목록 + 조인
  • 올바른 XML/HTML 파서를 사용하는 것은 그렇게 어렵지 않으며 권장됩니다. 텍스트와 같은 XML/HTML 구문 분석은 어느 시점에서 중단 될 수 있습니다.
+0

답장을 보내 주셔서 감사합니다. 몇 가지 후속 질문 : 왜 무한 루프입니까?''으로 시작하는 라인이 몇 줄 더 아래에 있습니다. 그래서'while' 루프가 그 라인에 도달하면 멈출 것으로 예상합니다. 'while' 루프가'' 라인에서 시작하고 모든 라인을 변수'xmlString'에 추가하여 ''으로 시작하는 라인에 도달 할 때까지 기다리십시오. 파일에서 행을 읽습니다. – someone2088

+0

'while'을 제거하고'elif' 내에서 직접'xmlString + = line;'을 실행하면 문자열에 ""을 계속 추가합니다. – someone2088

+0

Spot on. 그것은 훌륭합니다. 대단히 감사합니다. – someone2088