我正在研究一個Python程序,它將採用另一個程序生成的日誌文件(XML),並從中讀取數據,我想要的信息,並將其打印到控制檯/將其寫入另一個文件。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>
我想讀所有的信息每個標籤(即實際的XML),並將其附加到一個字符串中,然後將其轉換爲XML樹。
我已經開始編寫Python腳本來執行此操作,並且確實已經正確讀取了一些信息。我現在正想要讀取這兩個XML標記之間的所有內容,並將它們附加到字符串中,但我無法完全弄清楚如何執行此操作...我的Python程序當前看起來像這樣:
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
變量中?
感謝您的回答。一些後續問題:爲什麼這是一個無限循環?有一行以''開頭,後面有幾行,所以我希望'while'循環在到達該行時停止。我期待'while'循環在從''開始的行開始,並讀取每行,將該行附加到變量'xmlString',直到它到達以' '開頭的行,此時它應該停止讀取文件中的行。 –
someone2088
如果我直接在'elif'中刪除'while',並直接執行'xmlString + = line',那麼我最後會在字符串上附加''...... –
someone2088
點。這太棒了 - 非常感謝。 – someone2088