2016-12-08 3 views
1

txtファイル内の構造化されていない行から値を取得するのが難しいです。アルファとベータは私のデータ参照のキーで、X_1、X_2、X_3はファイルから取得する必要がある変数です(実際のデータには192の変数があります)。txtファイル内の一連の行の間の値からDataFrameを構築する

各X_n(n = 1,2,3)の最後の値(空白で区切られています)をアルファとベータ値の各対の辞書に抽出します。多かれ少なかれ、このような3Dパネルを手に入れることができます。 (解析後)このようになりfile.txtはファイル内の文字列の desirable dataframe

ライン:

Alpha = 180 
Beta = 0 
X_1 3.34 5 
X_3 4.34 7 
Alpha = 180 
Beta = 10 
X_1 4.23 2 
X_2 3.23 1 
Alpha = 180 
Beta = 20 
X_2 3.23 9 
. 
. 
. 
. 
Alpha = 180 
Beta = 90 
X_1 7.23 3 
X_2 9.14 3 
X_3 5.91 7 
Alpha = 170 
Beta = 0 
X_1 7.63 3 
X_2 4.84 2 
X_3 8.01 8 
. 
. 
(and so on) 

私の目標は、私の知る限り」

Alpha Beta x_1 x_2 x_3 
180 0  5 0 7 
180 10 2 1 0 
180 20 0 0 9 

180 90 3 3 7 
170  0 3 2 8 

以下のような3Dパネルを作成することです私は試しました。私はしかし、私はすべてのアルファとベータ値のためにループのため、この機能を使用することができませんでした正規表現

readings = [] 
with open('file.txt') as inputfile: 
    for line in inputfile: 
    readings.append(line.strip()) 

x_1_list =[] 
for r in readings: 
    if re.search('x_1,r') 
     c = re.split(r'\s+',r)[-1] 
     x_1_list.append(c) 
    else: 
     x_1_list.append(0.0) 

を使用することによりX_1、X_2 X_3の値を取得することができます。

提案がありますか?

答えて

0

入力ファイルを['アルファ'、 'ベータ'、 'X_1'、 'X_2'、 'X_3']値のグループとしてパースすることをお勧めします。

以下は作業コードです。それが自分自身について説明してくれることを願っていますが、明確化が必要な場合はコメントしてください。

KEYS = ['Alpha', 'Beta', 'X_1', 'X_2', 'X_3'] 
GROUP_START_MARKER = KEYS[0] 


def parse_group(handle, line): 
    value_dict = {} 
    assert line.startswith(GROUP_START_MARKER) 
    alpha_value = line.split(' = ')[1] 
    value_dict[GROUP_START_MARKER] = alpha_value 
    line = handle.readline().strip() 
    assert line.startswith('Beta') 
    beta_value = line.split(' = ')[1] 
    value_dict['Beta'] = beta_value 
    readings = [] 
    while True: 
     line = handle.readline().strip() 
     if line.startswith(GROUP_START_MARKER): 
      break 
     if not line: 
      break 
     key, _, value = line.split() 
     value_dict[key] = value 
    return value_dict, line 


def parse_file(filename): 
    value_list = [] 
    with open(filename) as inputfile: 
     line = inputfile.readline().strip() 
     while True: 
      if line.startswith(GROUP_START_MARKER): 
       value_dict, line = parse_group(inputfile, line) 
       if not line: 
        return 
       yield value_dict 


it = parse_file('file.txt') 
print '\t'.join(KEYS) 
for value_dict in it: 
    print '\t'.join(map(str, [value_dict.get(key, 0.0) for key in KEYS])) 
+0

こんにちは@azalea実際のケースでは、すべてのx_nキーに空白で区切られた3つの値がありますか? erorrが "あまりにも多くの値をアンパックする"を生成しました。 ので: アルファ= 180 ベータ= 0 X_1 3.34 5 somenumber X_3 4.34 7 somenumber の代わり: アルファ= 180 ベータ= 0 X_1 3.34 5 X_3 4.34 7 ありがとう! –

+0

'key、_、value = line.split()'行を 'key、_ value、_ = line.split()'に変更することは、行を空白で分割し、最初の値をkeyに割り当て、第3の値を値に、第2および第4の値を使用しない変数「_」に変換する。 – azalea

+0

HI @ azalea、それを持っています!私は前に混乱したウィット "_"でした。それは今解決した。どうもありがとう! –

関連する問題