[Python] IO - CSV 다루기


Development note/Python  2019. 12. 24. 09:00

안녕하세요. 명월입니다.


이 글은 Python에서 CSV를 다루는 방법에 대한 글입니다.


제가 예전에 Python에서 파일을 다루는 방법에 대해 설명한 적이 있습니다.

링크 - [Python] IO (파일 입출력)


Python은 로컬에서 자주 사용하는 스크립트 언어이다 보니 이런 파일 다루는 라이브러리가 잘 되어 있는 것 같습니다.

다른 언어도 지원을 안하는 건 아닌데.. 개인적으로는 Python이 로컬에서 데이터 만드는 게 편하지 않나 싶습니다.

# csv 모듈을 import한다.
import csv;

# 리스트형 데이터이다.(안에 튜플로 설정했지만, 리스트형 타입도 상관없다.
data = [('Tester','1'),('Who','2'),('Tom','3')];
# 파일을 연다. (여기서 내부에서 writeline을 사용하는 것같은데 newline을 설정하지 않으면 csv파일이 개행이 두번 이루어진다.)
with open('csvexample.csv','wt', newline = '') as handle:
  # 파일 리소스를 csv 모듈의 wrtier 함수에 넣는다.
  csv_out = csv.writer(handle);
  # data를 csv 파일로 만든다. (이것 한줄로 모든 리스트를 csv파일로 만드는 것)
  csv_out.writerows(data);
  # writerow 함수는 한 줄씩 만드는 것으로 for문과 같이 사용하면 위와 같다. 즉 list의 값에 조건식을 넣으려면 아래와 같이도 만들수 있다.
  #for item in data:
  #  csv_out.writerow(item);

csv파일이 콤마(,)와 개행의 구분으로 만들어 졌습니다. 이번에는 이렇게 만들어진 csv파일을 Python으로 읽어 오겠습니다.

# csv 모듈을 import한다.
import csv;
# 파일을 연다.
with open('csvexample.csv','rt') as handle:
  # 파일 리소스를 csv 모듈의 reader 함수에 넣는다.
  csv_in = csv.reader(handle);
  # 컴프리핸션을 통해 데이터를 리스트화 한다.
  data = [row for row in csv_in];
  print(data);

그대로 콤파(,)와 개행 구분으로 리스트로 csv파일을 읽어 왔습니다.


여기까지는 csv에 해더가 없는 경우를 만든 경우입니다.

딕셔너리를 이용하면 csv 파일에 첫번째 행은 데이터의 header(제목)으로 사용할 수 있습니다.

# csv 모듈을 import한다.
import csv;
# 데이터는 리스트형이지만 안에 데이터는 딕셔너리로 이루어져 있다.
data = [{'name':'Tester','no':1},{'name':'Who','no':2},{'name':'Tom','no':3}];
# 파일을 연다. (여기서 내부에서 writeline을 사용하는 것같은데 newline을 설정하지 않으면 csv파일이 개행이 두번 이루어진다.)
with open('csvexample.csv','wt', newline = '') as handle:
  # 파일 리소스를 csv 모듈의 DictWriter 함수에 넣는다. 딕셔너리에서 csv로 만들 데이터를 리스트 형으로 지정한다.
  csv_out = csv.DictWriter(handle, ['name', 'no']);
  # 헤더를 만든다. (생략하면 헤더 생성을 하지 않는다.)
  csv_out.writeheader();
  # data를 csv 파일로 만든다. (이것 한줄로 모든 리스트를 csv파일로 만드는 것)
  csv_out.writerows(data);
  # writerow 함수는 한 줄씩 만드는 것으로 for문과 같이 사용하면 위와 같다. 즉 list의 값에 조건식을 넣으려면 아래와 같이도 만들수 있다.
  #for item in data:
  #  csv_out.writerow(item);

딕셔너리로 이루어진 리스트로 csv를 만들었습니다. 그리고 첫 행은 header로 타이틀을 넣었습니다.

이번에는 다시 csv파일을 딕셔너리 타입으로 읽어 오겠습니다.

# csv 모듈을 import한다.
import csv;
# 파일을 연다.
with open('csvexample.csv','rt') as handle:
  # 파일 리소스를 csv 모듈의 DictReader 함수에 넣는다.
  csv_in = csv.DictReader(handle);
  # 컴프리핸션을 통해 데이터를 리스트화 한다.
  data = [row for row in csv_in];
  print(data);

결과가 조금 예상과는 다르게 나오네요. 그래도 딕셔너리 타입으로 csv를 읽어 온 것은 맞습니다.


여기까지 Python에서 CSV를 다루는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.