티스토리 뷰
반응형
네이버 지식인에서 줏은 문제이다. 텍스트 파일에 상당히 많은 양의 데이터가 있다. (내용으로보건데 특정한 기기의 로그 파일인 것 같다.) 해당 데이터로부터 ID, distance, spd 값을 추출하여 distance가 특정 범위 이내 일 때 SPD의 평균값을 구하고 싶다는 것이 요지이다.
일단 로그 데이터는 아래와 같은 포맷의 텍스트파일이다.
[2017-08-05 00:10:00.043] a.b.senser - lader> system:
[2017-08-05 00:10:00.043] a.b.senser - lader> ID: 1, distance: 137, spd: -40
[2017-08-05 00:10:00.043] a.b.senser - lader> ID: 2, distance: 155, spd: -34
이 파일에서 ID: 값, distance: 값, spd: 값
의 형태를 취하는 라인들을 추려내기만 하면 되기 때문에 사실 매우 간단한 문제이다. 우선 패턴을 만들어보면 다음과 같다.
import re
pat = re.compile(r'ID: (\d+), '
r'distance: (\d+), '
r'spd: ([0-9\-\+]+)'
)
search()
를 이용해서 패턴에 각 라인을 매칭하고, 매칭에 성공하면 groups()
를 이용해서 각 그룹이 추출된 튜플을 얻을 수 있는데, 이 각각의 값을 정수값으로 만들어서 각 변수에 나눠담으면 된다.
파일을 열고 라인을 처리하기 전에, 센서의 id 별로 spd 값을 모아둘 사전 데이터를 하나 만든다.
data = dict()
다음은 라인처리
with open('test.txt', encoding='utf8') as f:
for line in f:
matched = pat.search(line)
## 매칭에 실패한 라인은 건너뛴다.
if not matched:
continue
_id, distance, spd = [int(x) for x in matched]
## 거리에 따른 필터링
if 0 <= distance <= 100:
data.setdefault(_id, []).append(spd)
최종적으로 센서 ID 별 평균 SPD를 구하는 것은 간단하다.
for k, v in data.items():
avg = sum(v) / len(v)
print("id: {}, avg SPD: {}".format(k, avg))
반응형
'파이썬 how to' 카테고리의 다른 글
파일입출력 : 파일을 읽고 쓰는 방법 (0) | 2017.10.28 |
---|---|
CSV 파일 다루기 (0) | 2017.10.10 |
파이썬 값들의 변경가능/변경불가능 (0) | 2017.09.13 |
주어진 텍스트의 단어별 빈도 수 세기 (0) | 2017.06.27 |
리스트 정렬하는 방법 (0) | 2017.05.31 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- short_circuit
- ipython-notebook
- locals()
- 복수기준정렬
- 튜플언패킹
- 리눅스
- dict
- jupyter-notebook
- 파이썬
- 리스트
- leapYear
- mutability
- 이중리스트를 사용하지 않기
- 반복자
- sorted
- 사전
- Lambda
- python list
- 파일입출력
- 단어 빈도수
- 우분투
- 정렬키
- globals()
- iterable
- Python
- 정렬기준
- 표준입력
- 변경가능
- 함수형
- 파이썬노트북
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함