[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
,

CSV 파일에 불필요한 열이 포함되어있는 경우, 필요한 열만 필터링하여 활용

- 열의 인덱스 값을 사용하는 방법

- 열의 헤더를 사용하는 방법

 

열의 헤더를 사용해 특정(관심) 열을 필터링

- 관심있는 열 헤더를 쉽게 식별가능

- 여러개의 입력 파일을 처리할 때 열의 헤더는 같지만 열의 위치가 입력 파일에 따라 다를 때

 

다음 예제 코드는 [CSV] 열의 인덱스 값을 사용하여 특정열을 선택 에서와 동일하게 Name 및 BOD, TN, T-P열만 사용하기 위한 필터링을 헤더명을 이용해 수행

 

 

 

 

- 코드설명 -

 


  7 selected_column_name = ['Name', 'BOD', 'T-P', 'TN']

  8 selected_column_index = [ ]


 

7행

- 관심있는 헤더명이 들어있는 리스트변수(selected_column_name) 생성

8행

- 뒤에서 관심열의 인덱스값이 들어갈 리스트변수(selected_column_index) 생성

 

 


 14       next(freader)

 15       header = next(freader)

 16       for index_value in range(len(header)):

 17          if header[index_value] in selected_column_name:

 18             selected_column_index.append(index_value)

 19       print(selected_column_name)

 20       fwriter.writerow(selected_column_name)


 

14행

- freader객체에 next()함수를 사용하여 헤더에서 사용되지 않는 행 삭제

15

- freader객체에 next()함수를 사용하여 헤더에서 사용되는 행을 header 리스트변수로 읽어옴

16행

- header 리스트변수로 읽어온 헤더의 인덱스 값에 대해 반복문 수행

17행

- if문과 리스트 인덱싱을 통해 각 열의 헤더가 관심 헤더명과 동일한 값인지 판별

- header[index_value]가 selected_column_name과 같다면 18행 수행 그렇지 않다면 for문으로...

18행

- 17행에서 판별한 값이 포함되어있는 index_value값을 selected_column_index리스트 변수에 추가

19, 20행

- 관심있는 헤더를 화면과 파일로 출력

 


 21       for row_list in freader: 

 22          row_list_output = []

 23          for index_value in selected_column_index

 24             row_list_output.append(row_list[index_value])

 25          print(row_list_output)

 26          fwriter.writerow(row_list_output)


 

21행

- 헤더를 제외한 CSV파일의 값에 대해 for문 수행

22행

- 포함하려는(관심있는)행의 데이터 값을 저장할 빈 리스트(row_list_output) 생성

23행

- selected_column_index의 값을 반복

24행

- 23행의 인덱스 값에 해당하는 열의 데이터 값을 row_list_output에 추가

25, 26

- row_list_output의 값을 화면 및 파일에 출력

 

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

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

 

 

7_filtering_by_column_name.zip

Posted by Roiz
,

CSV 파일에 불필요한 열이 포함되어있는 경우, 필요한 열만 필터링하여 활용

- 열의 인덱스 값을 사용하는 방법

- 열의 헤더를 사용하는 방법

 

열의 인덱스 값을 이용해 특정 열을 필터링

- 열의 인덱스 값을 쉽게 식별가능

- 여러개의 입력 파일 처리 하기 위한 모든 입력 파일에서 열의 위치가 변경되지 않는 경우

 

다음 예제 코드는 Name 및 BOD, TN, T-P 열만 사용하기 위해 인덱스 값을 이용한 필터링 수행

 

 

 

 

- 코드설명 -

 


  8 selected_columns = [1, 6, 9, 10]


 

8행

- CSV에서 추출하려는 4열의 인덱스 값을 갖는 selected_column 리스트변수 생성

 


 14       for row_list in freader:

 15          row_list_output = []

 16          for index_value in selected_column:

 17             row_list_output.append(row_list[index_value])

 18          print(row_list_output)

 19          fwriter.writerow(row_list_output)


 

15

- CSV에서 추출하고자 하는 각 행의 값을 저장하기 위한 row_list_output 리스트변수 생성

16행

- selected_column에 저장되어있는 관심 인덱스 값을 반복하는 for문

17행

- 리스트의 append()함수를 사용해 selected_column에 정의된 특정 인덱스의 데이터 값을 row_list_output에 추가

- fwriter의 writerow()함수는 문자열이나 숫자의 시퀀스 자료형을 받으므로 리스트변수(row_list_output)를 만들어 놓는것이 유용함

18, 19행

- row_list_output의 값을 화면 및 파일에 출력

 

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

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

 

6_filtering_by_column_index.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', 'kyungan5']중 한 값을 포함하는 모든 행

- Date열에서 집합 ['2007-06-04', '2007-11-13']중 한 값을 포함하는 모든 행

 

다음 예제 코드는 행의 데이터 값이 어떤 집합의 원소를 포함하는지 판별하고, 전체 행에서 관심집합의 값을 포함하는 행들(부분집합)을 찾아 화면 및 파일로 출력

 

 

 

 

- 코드설명 -

 


  7 #important_dates = ['2007-06-04', '2007-11-13', '2007-12-12']

  8 important_stations = ['kyungan3', 'kyungan5']


 

8행(7행)

- 관심값에 해당하는 name을 important_stations 변수에 리스트형(type)으로 할당

 


 19          #a_date = row_list[2]

 20          a_name = row_list[1]

 21          #if a_date in important_dates:

 22          if a_name in important_stations:

 23             print(row_list)

 24             fwriter.writerow(row_list)


 

20행(19행)

- freader로 읽은 csv 파일의 각 행에서 name열(row_list[1])을 로드하여 a_name변수에 할당

( - freader로 읽은 csv 파일의각 행에서 date열(row_list[2])을 로드하여 a_date변수에 할당 )

22행(21행)

- if 문을 사용해 a_name 변수에 들어있는 name 열의 데이터 값이 important_stations 에 있는 관심 집합에 포함되는지 판별

( - if 문을 사용해 a_date 변수에 들어있는 date 열의 데이터 값이 important_date에 있는 관심 집합에 포함되는지 판별 )

23행, 24행

- 22행의 판별결과로 a_name가 important_stations에 포함된다면, 화면 및 파일에 출력

 

(*) 주석 처리된 부분을 기존 코드와 대체하면 - 관심값을 name에서 date로 변경하여 필터링

 

 

 

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

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

 

4_filtering_value_in_set.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
,

CSV 파일을 읽어 파싱(parsing)하고 다시 파일에 작성하는 방법

(csv 모듈 사용)

 

(*) csv모듈 사용의 장점중 하나는 데이터에 포함된 복잡한 패턴(1,000단위 쉼표)의 정확한 처가능 

 

 

 

 

 

 

 - 코드설명 -

 

(*) 이 코드는 "CSV 파일 읽고 쓰기(1)"의 코드와 유사하므로 차이 있는 행에 대해서만 설명

 


  2 import csv


 

2행

- csv 모듈의 내장 함수를 이용해 csv파일을 파싱하고 파일에 쓸수있도록 임포트

 


  9       freader = csv.reader(csv_in_file, delimiter=',')

 11       freader = csv.writer(csv_in_file, delimiter=',')


 

9행

- csv모듈의 reader() 함수를 사용하여 입력파일객체(freader) 생성

10행

- csv모듈의 writer() 함수를 사용하여 출력파일객체(fwriter) 생성

 

(*) 두번째 인수 delimiter=',' 는 입.출력 파일이 쉼표로 구분된다면 쓰지 않아도 됨

      예를 들어 세미콜론(;), 탭(\t)으로 구분된 입력파일을 읽거나 출력하고자 한다면

      delimiter=';' 또는 delimiter='\t' 를 지정해야함

 


 13          fwriter.writerow(row_list)


 

13행

- 객체 fwriter의 writerow()함수를 사용하여 각 행의 값을 리스트 자료형으로 파일에 출력

 

(*) 최종적으로 코드를 아래와 같이 제대로 파싱된 결과 확인 가능

 

 

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

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

 

 

2_simple_parsing_rw.zip

200701-200712(C).zip

 

Posted by Roiz
,


CSV 파일을 읽어 파싱(parsing)하고 다시 파일에 작성하는 방법

(내장 csv모듈 미사용)




 

 

 

- 코드설명 -

 


  6 with open(input_file, 'r', newline='') as freader :

  7    with open(output_file, 'w', newline='') as fwriter :


 

 

6행

- with 문을 이용해 input_file 을 객체 freader로 오픈

- open( ) 함수에서 'r'은 읽기모드 - input_file이 읽기모드로 열렸음을 의미

7행

- with 문을 이용해 output_file 을 객체 fwriter로 오픈

- open( ) 함수에서 'w'는 쓰기모드 - output_file이 쓰기모드로 열렸음을 의미


(*) with 문은 종료될때 자동으로 파일 객체를 닫아줌




  8       freader.readline()

  9       header = freader.readline()

 10       header = header.strip()

 11       header_list = header.split(',')


 


8행

- freader 객체의 readline() 함수를 이용해 입력 CSV파일의 사용하지 않는 

  첫번째 행을 삭제

9행

- freader 객체의 readline() 함수를 이용해 입력파일의 헤더행을 문자열로 읽어 header변수에 할당

10행

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

11행

- spilt() 함수를 이용해 쉼표 기준으로 구분하여 리스트(hader_list)에 할당

- header_list의 각 원소는 입력 파일 각각에 대한 열의 헤더

 




 12       print(header_list)

 13       fwriter.write(','.join(map(str, header_list))+'\n')




12행

- header_list의 값을 화면에 출력

13행

- fwriter 객체의 write() 함수를 이용해 header_list의 값을 파일에 출력

- map()함수는 header_list의 각 원소에 str() 함수를 적용하여 각 원소를 문자열로 작성

- join()함수는 header_list의 각 값사이 쉼표를 삽입하고 리스트를 문자열로 변환

- +'\n' 는 개행문자 추가

- 마지막으로, fwriter객체는 해당 문자열을 출력파일의 첫번째 라인에 작성



 14       for row in freader :

 15          row = row.strip()

 16          row_list = row.split(',')

 17          print(row_list)

 18          fwriter.write(','.join(map(str, row_list))+'\n')



14행

- 반복문을 이용해 헤더를 제외한 나머지 행 반복

- 입력 파일의 모든 행에 대하여 반복실행...(15행~18행 반복)

15행

- strip() 함수를 사용해 row변수의 문자열 양끝의 공백, 탭 및 개행문자 제거 후 row에 할당

16행

- split() 함수를 사용해 문자열을 쉼표 기준으로 분리하여 row_list에 할당

17행

- 쉼표를 기준으로 분리된 row_list를 화면에 출력

18행

- (13행과 동일) row_list의 값을 ','로 구분하여 파일에 출력

 

 

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

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

 

1_simple_parsing_rw.zip

200701-200712(M).zip

 

Posted by Roiz
,