私は、別のプログラムによって生成されたログファイル(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
ループで、外側のループに変更された)のです
ご回答ありがとうございます。フォローアップの質問のカップル:なぜそれは無限ループですか?''で始まる行がさらにいくつかありますので、 'while'ループがその行に到達すると停止することを期待しています。 'while'ループが' 'で始まる行から開始し、変数' xmlString'にその行を追加するすべての行を ' 'で始まる行に到達するまで読み込み、その時点で停止しますファイルから行を読み込みます。 –
someone2088
'while'を削除し、' elif'の中で直接 'xmlString + = line;'を実行すると、文字列に ''という行が繰り返し追加されてしまいます。 –
someone2088
Spot on。それは素晴らしいです - ありがとう。 – someone2088