반응형
텍스트 파일 (주로 로그파일) 이 고정길이로 (fixed length) 되어 있으면 파이썬이나 혹은 다른 스크립트를 이용해서 특정 필드의 값을 가져오는 것이 아주 간단합니다.
예를 틀어 아래와 같은 텍스트 파일에서 이름, 도시, 나이, 성별을 가져오려면
name age city sex
michael 31 NY m
jane 32 LA f
1
2
3
4
5
6
|
f = open(sys.argv[1], 'r')
lines = f.readlines()
for line in lines:
name = line[:10]
age = line[10:20]
city = line[20:30]
|
cs |
이런 식으로 처리할 수 있는데요, 만일 텍스트 파일이 가변길이로 되어 있고, name, value 형식으로 되어 있으면 어떻게 처리할 까요?
예를 들면
name michael age 31 city NY sex m
name jane city LA sex f age 32
보면 필드의 길이가 다 다를 뿐 아니라 순서도 다른 것을 알 수 있습니다.
이런 경우, 파이썬의 인덱싱 기능으로 간단히 처리가 가능합니다.
1 2 3 4 5 6 7 | f = open(sys.argv[1], 'r') lines = f.readlines() for line in lines: item = line.split(" ") user_name = item[item.index("name")+1] user_age = item[item.index("age")+1] user_city = item[item.index("city")+1] | cs |
위 코드를 간단히 설명해 보겠습니다.
- f = open(sys.argv[1], 'r')
파이썬 스크립트의 첫 번째 파라메터 (여기서는 처리할 텍스트 파일) 을 읽기 모드로 읽습니다. - lines = f.readlines()
위에서 읽은 파일의 전체 라인을 한 번에 읽어서, 각각의 라인들을 "lines" 라는 리스트에 집어 넣습니다. 각 라인이 하나의 리스트 멤버가 됩니다. - for line in lines:
위에서 만든 lines 리스트에서 각각의 멤버롤 line이라는 변수에 대입하여 iteration (반복작업) 을 시작합니다. (멤버 전체가 반복작업 될 때 까지) - item = line.split(" ")
파일의 한 라인을 스페이스로 나누어, 나누어진 값들을 item이라는 리스트에 집어 넣습니다.
여기서 파이썬 텍스트 클래스의 메서드인 split을 사용 했습니다.
만일 텍스트 파일이 스페이스가 아니라 다른 문자 (쉼표 등) 으로 구분되면 그 문자 (delimeter) 를 split메서드의 인자로 주면 됩니다. - user_name = item[item.index("name")+1]
처리하는 행에서 사람의 이름을 찾는데, 그 위치는 리스트 내의 "name" 이라는 텍스트 바로 다음이므로 item.index("name")+1 를 인덱스로 가지는 리스트 멤버를 찾아서 user_name이라는 변수에 대입 합니다.
여기서는 리스트[인텍스] 로 리스트의 특정 값을 꺼내는 방법과, "리스트.index" 라는 메서드를 해당 문자가 몇 번째 오는지 알아내기 위해 사용했습니다.
어떻게 보면 매우 간단한데, 실무에서 유용하게 쓸 수 있는 부분이라 공유해 보았습니다.
감사합니다. ^^
반응형