2016-06-28 11 views
0

私は、テスト結果をテキストファイルとして出力するこのテストスイートを持っています。ここ はサンプルです:Pythonで与えられた行の整数のテキストファイルを解析する

File Opened: Tuesday, June 26, 2016, 10:17:13 AM 

File Opened: Tuesday, June 26, 2016, 10:17:29 AM 
Radio Test BER LOOP BACK successful 
Radio Test PAUSE successful 
Radio Test BER LOOP BACK successful 

File Opened: Tuesday, June 28, 2016, 10:18:11 AM 
Bits received     10152 
Bits in error      117 
Access code bit errors  0 
Packets received    49 
Packets expected   2707 
Packets w/ header error 0 
Packets w/ CRC error  0 
Packets w/ uncorr errors 0 
Sync timeouts     3 
================================== 
Bits received     10368 
Bits in error      85 
Access code bit errors  0 
Packets received    52 
Packets expected   2758 
Packets w/ header error 0 
Packets w/ CRC error  0 
Packets w/ uncorr errors 0 
Sync timeouts     1 
================================== 
Bits received     10152 
Bits in error      93 
Access code bit errors  0 
Packets received    49 
Packets expected   2707 
Packets w/ header error 0 
Packets w/ CRC error  0 
Packets w/ uncorr errors 0 
Sync timeouts     3 

私はBits receivedBits in error後に番号を抽出し、パーセンテージを得るためにそれらを分割しようとしています。

次に、matplotlib.pyplotの散布図としてプロットしたいと思います。

私はこのファイルからこれらの数値を取得するのに苦労しています...私はこれをどのように解析しているかで何かを台無しにしています。

どちらの方法でも、私はこれで自分のやり方を感じています。これは可能な限りエレガントな方法ではないと確信しています。これはPythonのような単純な作業のようですが、私は確かに必要以上に難しくしています。

これはどのように処理しますか? おかげ

答えて

3

はファイルを介して、そしてちょうどループを2度receivedデータのための配列、およびerrorデータのための1つを作成し、解析:

receivedData = [] 
errorData = [] 
with open("data.txt") as f: 
    for line in f: 
     if line.startswith("Bits received"): 
      receivedData.append(int(line.split()[-1])) 
     elif line.startswith("Bits in error"): 
      errorData.append(int(line.split()[-1])) 
     else: 
      #do normal stuff with other lines 
      pass 
+0

私はそれがすべてを行いので、多くのことをPythonのような、しかし、あなたはあなたがそれを使用する前に、すべてを知っている必要がありますようにそれはそう効果的に'startswith'、' split'、 'append'は、彼らが最初に信頼できるように働いていると私には一見信じられません...彼らと一緒にシンフォニーを組むことは、慣れるのに苦労していることです。 – testname123

+0

ええ、いくつかの非常にきちんとした組み込み関数があります:) –

1

もう一つの簡単な方法は、正規表現ライブラリreを使用することです。 (https://docs.python.org/2/library/re.html

import re 
pattern1 = re.compile(r'Bits received\s+(\d+)') # \d means any digit character 
pattern2 = re.compile(r'Bits in error\s+(\d+)') 

with open('path/file.txt', 'r') as f: 
    text = f.read() 
    received = int(pattern1.match(text).group(1)) 
    in_error = int(pattern2.match(text).group(1)) 
    value_of_interest = in_error/received 

このアプローチでは、すべての入力ファイルにこれらの2行があることを前提としています。その仮定を行うことができない場合は、その存在を確認するためにmatch ESを破る:

match1 = pattern1.match(text) # re.MatchObject if the pattern is found 
if match1: # None if it's not found 
    received = int(match1.group(1)) # re.MatchObject.group(1) is the first parenthesized group 
match2 = pattern2.match(text) 
if match2: 
    in_error = int(match2.group(1)) 
関連する問題