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