2017-10-05 13 views
0

私は、別のプログラムによって生成されたログファイル(XML)を取得するPythonプログラムを作成しています。必要な情報をコンソールに出力したり、別のファイルに書き込んだりすることができます。Python-特定の値を持つ2行のファイルを1行ずつ読み込む方法

私はデータが含まれているから読んでいたログファイルのような特定の形式で書き込まれている(ログの数)、:私は間の情報のすべてを読みたい

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)を追加し、それを文字列に追加します。この文字列はXMLツリーに変換されます。

これを行うためのPythonスクリプトの作成が始まりました。情報の一部を正しく読み取るようにしました。私は今、2つの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実行(私は彼らのデバッグコンソールに表示取得)が、その後、第2 elif(すなわち、1つに実行したとき私は現在、XMLタグ内のデータを読むために作業しています)、コンソールは何もしていないかのようにしばらくの間、フリーズして、最終的には次のメッセージを表示します。

殺し

私はそれがこれらのタグの間に線を読み取り、変数xmlStringにそれらを追加し、(すなわち、一方でメモリか何かが不足しているためであると推測しています2番目のコード内のコードelif)...?

誰も私がここで間違っていることを説明することはできますか?私が指定した2つのタグ間の情報だけを読み込み、その変数を私が作成した変数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 
    

    注:あなたは同様に、メインループでタグの終わりまで、いくつかのロジックをタグの開始に遭遇したときのフラグを設定し、蓄積しなければなりません適切なXML/HTMLパーサーを使用することはそれほど難しくないことが推奨されています。テキストのようなXML/HTMLの解析は、ある時点で中断する可能性があります。

+0

ご回答ありがとうございます。フォローアップの質問のカップル:なぜそれは無限ループですか?''で始まる行がさらにいくつかありますので、 'while'ループがその行に到達すると停止することを期待しています。 'while'ループが' 'で始まる行から開始し、変数' xmlString'にその行を追加するすべての行を ''で始まる行に到達するまで読み込み、その時点で停止しますファイルから行を読み込みます。 – someone2088

+0

'while'を削除し、' elif'の中で直接 'xmlString + = line;'を実行すると、文字列に ''という行が繰り返し追加されてしまいます。 – someone2088

+0

Spot on。それは素晴らしいです - ありがとう。 – someone2088

関連する問題