다른 프로그램에서 생성 된 로그 파일 (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
루프에서, 외부 루프에서 수정)의
답장을 보내 주셔서 감사합니다. 몇 가지 후속 질문 : 왜 무한 루프입니까?''으로 시작하는 라인이 몇 줄 더 아래에 있습니다. 그래서'while' 루프가 그 라인에 도달하면 멈출 것으로 예상합니다. 'while' 루프가'' 라인에서 시작하고 모든 라인을 변수'xmlString'에 추가하여 ' '으로 시작하는 라인에 도달 할 때까지 기다리십시오. 파일에서 행을 읽습니다. –
someone2088
'while'을 제거하고'elif' 내에서 직접'xmlString + = line;'을 실행하면 문자열에 ""을 계속 추가합니다. –
someone2088
Spot on. 그것은 훌륭합니다. 대단히 감사합니다. – someone2088