2016-06-25 94 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 

我想讀下列ERR的數目對於所有n個點「P」,「V」,「s」和在陣列err_p「T」,err_v, 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