[CSV] 행의 연속선택

Python 2018. 12. 12. 16:35

CSV파일에서 분석해야하는 특정행이 있는경우, 필요한 행을 추출하여 활용

 

다음 예제 코드는 row_counter라는 변수를 이용해 행번호를 추적, 필요한 행을 식별하고 선택하여 필터링 수행

 

 

 

- 코드설명 -

 


  7 row_counter = 0

 

            ...

 

 13       for row in freader:

 14          if row_counter >= 24 and row_counter <= 29:

 15             print([value.strip() for value in row])

 16             fwriter.writerow([value.strip() for value in row])

 17          row_counter += 1


 

 

7행

- 행을 판별하기위한 변수(row_counter) 생성

 

...

 

13행

- freader로 읽어드린 CSV파일의 전체행 반복..

14행

- row_counter변수를 통해 24번째 줄 이상이고 39번째 줄 이하인 행을 필터링

15, 16행

- if문을 통해 필터링된 CSV파일의 24번째줄~39번째 줄을 화면 및 파일에 출력

17행

- 매 행마다 1식증가하여 행을 카운팅(현재행 판별을 위해)

 

 

(*) 출력파일 r_select_contiguous_necessary_row.csv를 통해 결과 확인

(*) 소스코드 및 csv파일 첨부

 

소스코드 및 CSV.zip

 

 

Posted by Roiz
,

특정한 패턴과 일치하거나 패턴(정규표현식)이 포함되어있는 행에 대한 필터링

 

다음 예제 코드는 어떤 행의 값이 특정 패턴과 일치하는지 판별, 패턴과 일차하는 값을 갖는 행의 데이터셋 출력

- 데이터셋에서 Date열의 데이터 값이 5열이후에 '-04-'를 포함하는 모든행을 필터링

 

 

 

 

 


   3 import re


 

3행

- re모듈(정규 표현식 모듈)의 함수를 사용할 수 있도록 re 모듈 import

 


   8 pattern = re.compile(r'(?P<my_pattern_group>^....-04-.*)', re.I)


 

8행

- re모듈의 compile() 함수를 사용해 정규 표현식 변수(pattern) 생성

- r은 작은 따옴표 사이의 패턴이 원시 문자열임을 나타냄

- 메타문자 ?P<my_pattern_group> 는 <my_pattern_group>그룹에 포함되어있는 하위 문자열 필터링

- 본 예제의 패턴은 ^....-04-.* 임

- 캐럿(^)은 문자열이 시작하는 패턴을 검색

- 마침표(.)는 개행을 제외한 임의 문자 하나를 나타냄

- 별표(*)는 메타 문자 앞에 있는 문자가 0번이상 일치해야함을 나타냄

- 따라서 ^....-04-.* 는 개행문자를 제외한 임의문자 4개로 시작하고 5~8열은 -04- 이고 이후 개행문자를 제외한 모든 문자가 몇번이든 올수 있다는 의미

- 즉, 04월에 해당하는 모든 행을 필터링 하라는 의미

- re.I 인수는 정규 표현식이 대소문자를 구분하지 않음

 


 19          date = row_list[2]

 20          if pattern.search(date):

 21             print(row_list)

 22             fwriter.writerow(row_list)


 

19행

- 리스트 인덱싱을 이용해 csv파일에서 Date열을 추출하고 이를 date변수에 할당

20행

- re 모듈의 search 함수를 이용해 date변수에 할당된 값을 앞서 정의한 패턴으로 필터링

21, 22행

- 필터링된 패턴을 화면과 파일로 출력

 

(*) 출력파일로 설정한 r_filtering_value_match_pattern.csv를 통해 결과확인

(*) 소스코드 첨부(csv 파일은 [CSV]파일 읽고 쓰기(2) 에서 확인가능....)

 

5_filtering_value_match_pattern.zip

Posted by Roiz
,

특정 조건에 부합하는 행의 값을 판별하고, 조건에 충족하는 행을 필터링

 

 

 

다음 예제 코드는 두가지 조건(Name이 'kyungan3' 이고 TDJG가 '1000' 이상인 행)을 판별하고, 조건을 충족하는 행으로 구성된 데이터셋을 화면 및 파일로 출력

 

 

- 코드설명 -

 


 11     next(freader) 

 12     header=next(freader) 

 13     print(header)

 14     fwriter.writerow(header)


 

 

11행

- csv모듈의 next() 함수를 사용하여 입력파일의 의미없는(?) 첫번째 행을 삭제

12행

- csv모듈의 next() 함수를 사용하여 입력파일의 두번째 행을 리스트변수 header에 할당

13행

- print() 함수를 사용하여 헤더 행을 화면에 출력

14행

- 헤더 행을 파일에 출력

 


 16       station_name = str(row_list[1]).strip()

 17       TDJG = str(row_list[13]).strip().replace(',','')

 18       if station_name == 'kyungan3' and float(TDJG) > 1000.0:

 19         print(row_list)

 20         fwriter.writerow(row_list)


 

16행

- 각 행의 Name열에 해당하는 값을 가져와 station_name 변수에 할당

- 리스트 인덱싱(row_list[1])을 사용하여 각 행의 두번째 열(Name열)의 로드

str() 함수를 사용하여 값을 문자열로 반환

strip() 함수를 이용해 문자열의 양끝에서 공백, 탭, 개행문자 등 제거

17행

- 각 행의 TDJG열에 해당하는 값을 가져와 TDJG 변수에 할당

- 리스트 인덱싱(row_list[13])을 통해 각 행의 14번째 열(TDJG열)의 값 로드

- str() 함수를 사용하여 값을 문자열로 반환

- strip() 함수를 이용해 문자열의 양끝에서 공백, 탭, 개행문자 등 제거

- replace() 함수를 이용해 1000단위 쉼표 제거

18행

- 각 행의 값들이 두가지 조건에 부합하는지 판별(if문)

- station_name이 'kyungan3' 이면서 TDJG값이 1000 이상인 행을 필터링

- 두가지 조건에 모두 부합하는 행을 선별하여 조건에 맞는다면 if문 내부코드 수행

19행, 20행

- 두 조건에 모두 부합하는경우 수행되며

- 필터링된 row_list를 화면과 파일에 각각 출력

(*) 16행 ~ 20행은 for 반복문으로 csv파일 전체열에 대하여 수행

 

(*) 출력파일로 설정한 'filtering_value_meet_condition.csv'를 통해 결과 확인

(*) 소스코드 파일 첨부(csv파일은 [CSV] 파일 읽고 쓰기(2) 에...)

 

 

3_filtering_value_meet_condition.zip

 

 

Posted by Roiz
,