从特定行读取特定数字

时间:2016-06-25 02:32:10

标签: python file-io

我有一个特定的文本文件,用于存储关于'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_p,err_v,err_s,err_t中所有n个'p','v','s'和'T'的列err下的数字。是否可以使用python完成?行编号只是为了使读者更清楚,它们实际上并不是文本文件的一部分。

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

迭代文件中的行;分开每一行;选出你感兴趣的部分;如果符合您的条件,保存

使用几个助手来提高可读性

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)

使用一套来测试每一行。

{{1}}

正则表达式解决方案要求所有数字的格式为数字点数。

构建足够的正则表达式模式;一次读取整个文件;找到数据中的所有匹配项;存储错误。

{{1}}

如果这些行的结构与示例不同,则可能会出现意外结果。