2016-06-25 4 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', '의'와 배열 err_p에서 'T', err_v에 대한 열 ERR 아래의 수를 읽으려면, 다음과 같이 파일의 라인은 각각 err_s, err_t. 파이썬을 사용하여 수행 할 수 있습니까? 행 번호는 독자에게 더 명확하게하기 위해 작성되었으며 실제로 텍스트 파일의 일부가 아닙니다.

+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