2017-10-05 153 views
0

我正在研究一個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變量中?

回答

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

這是一個無限循環(line被修改外循環,而不是在while循環),吃你的機器的所有記憶。

你的邏輯在這裏被打破。遇到標籤的開始時,應設置一個標誌,和積累,直到標籤的主循環末,一些邏輯,如:

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

如果我直接在'elif'中刪除'while',並直接執行'xmlString + = line',那麼我最後會在字符串上附加''...... – someone2088

+0

點。這太棒了 - 非常感謝。 – someone2088