이번 글에서는 Python 에서 csv 파일을 읽을 때 사용하는 함수인 Reader 와 DictReader 의 차이점을 살펴보려고 합니다.

또, csv 파일의 column 이 추가하거나 삭제할 때, Reader 와 DictReader 를 사용한 프로그램이 어떻게 수정되는지도 비교해 보겠습니다.

1. csv 파일의 column 이 변경되는 케이스

python 을 하다 보면 excel file 에 있는 data 를 읽어야 할 경우가 종종 있습니다.

저는 주식 투자를 위해 python 프로그램을 짜면서, 아래와 같이 회사 정보를 관리하였습니다.

  1. 필요한 정보를 excel 파일로 만듬
  2. csv 로 저장
  3. csv reader 로 python에서 읽어오기

문제는 이 엑셀 파일의 새로운 회사 정보를 추가하고 싶은데, 기존 프로그램에서 필요한 정보를 헤더가 아닌 column 번호로 가져왔더니 프로그램을 많이 수정해야 된다는 것입니다.

2. csv Reader DictReader 차이점

예를 들어, 아래와 같은 정보를 stock_ex.csv 파일로 저장했다고 합시다.

STOCK_ID,SECTOR
000660,SEMI
005930,SEMI
006400,EV

STOCK_ID: 기업 종목 코드, SECTOR: 업종

이제 python 에서 stock_ex.csv를 Reader함수로 읽어 각 행을 출력해 봅시다.

f = open('stock_ex.csv','r')
rdr = csv.reader(f)
header = next(rdr)
for row in rdr:
  print(row)

출력

['000660', 'SEMI']
['005930', 'SEMI']
['006400', 'EV']

각 row를 list 형태로 저장하는 걸 알 수 있습니다.

이제 python 에서 stock_ex.csv를 DictReader함수로 읽어 각 행을 출력해 봅시다.

import csv

f = open('stock_ex.csv','r')
rdr = csv.DictReader(f)
for row in rdr:
  print(row)

출력


{'STOCK_ID': '000660', 'SECTOR': 'SEMI'}
{'STOCK_ID': '005930', 'SECTOR': 'SEMI'}
{'STOCK_ID': '006400', 'SECTOR': 'EV'}

각 row를 Dictionary 형태로 저장하는 걸 알 수 있습니다.

두 함수의 차이점을 정리하면 아래와 같습니다.

  • csv.Reader : List
  • csv.DictReader : Dictionary

3. csv data 변경 시 코드 수정 비교 – Reader, DictReader

이제 stock_ex.csv 의 STOCK_ID, SECTOR를 사용해 ‘ STOCK_ID 는 SECTOR에 속함‘ 라는 메세지를 만들어 봅시다.

csv.Reader 를 사용해서 위의 메세지를 출력하는 코드를 만듭니다.

f = open('stock_ex.csv','r')
rdr = csv.reader(f)
header = next(rdr)
for row in rdr:
  msg='{} 는 {} 에 속함'.format(row[0],row[1])
  print(msg)

출력

000660 는 SEMI 에 속함
005930 는 SEMI 에 속함
006400 는 EV 에 속함

그런데 이 출력 메세지의 종목 코드만으로는 무슨 회사가 어떤 업종에 속한다는 건지 알 수가 없습니다.

그래서, stock_ex.csv파일에 종목명과 업종 사이에 회사 이름을 추가하였습니다.

STOCK_ID,NAME,SECTOR
000660,SK하이닉스,SEMI
005930,삼성전자,SEMI
006400,삼성SDI,EV

{회사이름} 는 {업종} 에 속함‘ 이라는 메세지를 만들기 위해 코드를 수정합니다.

msg='{} 는 {} 에 속함'.format(row[0],row[1])
->msg='{} 는 {} 에 속함'.format(row[1],row[2])

출력

SK하이닉스 는 SEMI 에 속함
삼성전자 는 SEMI 에 속함
삼성SDI 는 EV 에 속함

만약, csv파일에 column 수가 굉장히 많고, 사용하는 column이 다양하다면, 코드 수정 작업이 복잡할 것입니다.

이제, csv.DictReader 를 사용해서 위와 같은 결과를 출력하는 코드를 실행해봅시다.

f = open('stock_ex.csv','r')
rdr = csv.DictReader(f)
for row in rdr:
  msg='{} 는 {} 에 속함'.format(row['STOCK_ID'],row['SECTOR'])
  print(msg)

출력

000660 는 SEMI 에 속함
005930 는 SEMI 에 속함
006400 는 EV 에 속함

stock_ex.csv 파일에 회사명을 ‘NAME‘로 추가하고 코드를 수정해 보겠습니다.

msg='{} 는 {} 에 속함'.format(row['STOCK_ID'],row['SECTOR'])
->msg='{} 는 {} 에 속함'.format(row['NAME'],row['SECTOR'])

출력

SK하이닉스 는 SEMI 에 속함
삼성전자 는 SEMI 에 속함
삼성SDI 는 EV 에 속함

수정하기 원하는 column 의 header 만 알면 프로그램을 쉽게 수정할 수 있습니다.

3. 결론

만약, csv 파일의 크기가 크지 않고, 변경이 많다면 DictReader 를 사용하는 것이 프로그램을 관리하기 편합니다.

하지만, csv 파일의 크기가 크고, 변경이 많지 않다면 Reader 를 사용하는 것도 좋습니다.

이 경우, column index 로 프로그램을 만드는 것보다 column 헤더와 index 를 매칭한 후 프로그램을 짜면 column 헤더가 변경되어도 프로그램을 쉽게 관리할 수 있습니다.

  • csv.DictReader : csv 파일이 크지 않고 변경이 많다.
  • csv.Reader : csv 파일이 크고, 변경이 많지 않다.

0개의 댓글

답글 남기기

Avatar placeholder