2014-06-30 3 views
0

내가 운영중인 텍스트 파일이 있다고 가정 해보십시오. 이런 식으로 뭔가 (희망이 너무 읽을 수 없습니다) : 예외 처리기에서Python : 문자열 인덱스의 행 번호와 열 번호를 가져 옵니까?

data_raw = open('my_data_file.dat').read() 
matches = re.findall(my_regex, data_raw, re.MULTILINE) 
for match in matches: 
    try: 
     parse(data_raw, from_=match.start(), to=match.end()) 
    except Exception: 
     print("Error parsing data starting on line {}".format(what_do_i_put_here)) 
     raise 

주의 what_do_i_put_here라는 특정 변수가있다. 내 질문은 : 어떻게 내 스크립트가 해당인쇄 할 수 있도록 그 이름을 할당 할 수있는 '나쁜 지역'내가 시작하려고 노력하고있어? 나는 파일을 다시 읽지 않아도되고, 내가 뭘할지 모르겠다. ...

+0

정규 표현식이 새로운 라인을 사용합니까? 그렇지 않으면 라인 단위로 찾아 낼 수 있습니다. 그러면 라인 번호를 쉽게 얻을 수 있습니다. – dustyrockpyle

+0

예, 여러 행을 사용합니다 (따라서're.MULTILINE'을 사용했습니다) –

+0

re.findall 문자열 목록을 반환하지 않습니까? : https://docs.python.org/2/library/re.html . 문자열에는 시작 또는 끝 메서드가 없습니다. –

답변

0

나는 이것을 썼다. 그것은 검증되지 않은 비효율적이다하지만 내 예외 메시지가 조금 명확하게 도움이 않습니다 심지어 열 번호가 막연하게 정확한 있는지 테스트하지 않았습니다

def coords_of_str_index(string, index): 
    """Get (line_number, col) of `index` in `string`.""" 
    lines = string.splitlines(True) 
    curr_pos = 0 
    for linenum, line in enumerate(lines): 
     if curr_pos + len(line) > index: 
      return linenum + 1, index-curr_pos 
     curr_pos += len(line) 

. 나는 YAGNI를 준수하지 않았다.

+1

표준을 섀도 잉하는 것을 피하기 위해's'를 사용하는 것이 좋습니다. 라이브러리'string' 모듈. –

관련 문제