2016-06-25 11 views
0

私は特定のプロパティを格納する特定のテキストファイルを 'n'個のポイントについて持っています。特定の行から特定の番号を読む

line 1 yy 
line 2 zz  
line 3 aa  
line 4 bb 
line 5 cc  
line 6 Absolute values 
line 7     lut     flp     err 
line 8 POINT 1 
line 9  p  1692611.81738281  1692410.66790291  0.00011884 
line 10 v   0.03333289   0.03333289  0.00000000 
line 11 s   2238.03499519   2238.03499519  0.00000000 
line 12 T   320.62832154   320.67108467  0.00013337 
line 13 POINT 2 
line 14  p  3031521.94006348  3030845.24499738  0.00022322 
line 15  v   0.01444968   0.01444968  0.00000000 
line 16  s   1977.17270772   1977.17270772  0.00000000 
line 17  T   288.46789127   288.45870243  0.00003185 
line 18 POINT 3 
. 
. 
. 
n points 

私はすべてのn個の点「P」、「V」、「S」とアレイerr_pに「T」、err_vの列ERR下番号を読みたい、次のようにファイルの線でありますそれぞれ、err_s、err_t。 Pythonを使用して行うことは可能ですか?行番号は、読者にはっきりさせるために書かれていますが、実際にはテキストファイルの一部ではありません。

+0

値が常に同じ行番号に対応する行はありますか? –

+0

@ I'L'Iはい、行は常に固定されています。 – Aspro

答えて

0
#!/usr/bin/env python3 

f = open('data') 

err_dict = {k: [] for k in ['p','v','s','T']} 

i = 0 
for line in f: 
    i += 1 
    if i < 8: 
     continue 

    if line.startswith("POINT "): 
     continue 

    line_split = line.split() 
    err_dict[line_split[0]].append(line_split[3]) 

err_p = err_dict['p'] 
err_v = err_dict['v'] 
err_s = err_dict['s'] 
err_t = err_dict['t'] 
+0

あなたが答えに満足しているなら、upvoteも歓迎してください:) –

0

ファイル内の行を繰り返します。各行を分割する。あなたが興味を持っている部分を選んでください。 あなたの条件に一致する場合はそれを保存します。

は、各ラインをテストするためにセットを使用して、読みやすさ

import operator 
col_zero = operator.itemgetter(0) 
err = operator.itemgetter(3) 

のためにヘルパーのカップルを使用してください。

pvst = set(['p','v','s','T']) 

err_p = [] 
err_v = [] 
err_s = [] 
err_T = [] 
array_map = {'p':err_p, 'v':err_v, 's':err_s, 'T':err_T} 

with open('file.txt') as f: 
    # iterate 
    for line in f: 
     line = line.strip().split() 
     # test 
     if col_zero(line) in pvst: 
      # store 
      array_map[col_zero(line)].append(err(line)) 

正規表現ソリューションは、フォーマット桁ドット桁を持っているすべての番号が必要です。

十分な正規表現パターンを作成します。一度にファイル全体を読む。データ内のすべての一致を見つける。エラーを格納します。

pattern = r'(p|v|s|T)\s*?(\d*?\.[^\s]*)\s*?(\d*?\.[^\s]*)\s*?(\d*?\.[^\s]*)' 
regex = re.compile(pattern) 
with open('file.txt') as f: 
    data = f.read() 

for match in regex.finditer(data): 
    err_type, lut, flp, err = match.groups() 
    array_map[err_type].append(err) 

これらの線の構造は一例と異なる場合、予期しない結果があるかもしれません。

+0

正規表現を導入してくれてありがとう、本当に助かりました! – Aspro

関連する問題