본문 바로가기

Python

[Python] 파이썬으로 csv 다루기 (읽기,쓰기,수정,추가)

 

림코딩의 파이썬으로 csv 다루기 강좌 (읽기,쓰기,수정,추가)

 
안녕하세요! 림코딩입니다. 데이터 분석업무를 하다보면 엑셀 파일을 다룰때가 참 많습니다. 그러다보면 흔히 '노가다'라는 끝도 없는 반복작업을 해야될 순간도 오는데요. 이럴때 프로그래밍 언어를 통해서 이러한 작업을 자동화해주면 많은 시간을 절약할 수 있습니다. 실제로 저도 raw데이터를 가지고 엑셀로 정리할 떄는 파이썬 스크립트를 자주 활용하는데요. 이번 강좌에서는 파이썬 스크립트로 쉽게 엑셀을 다루는 방법을 소개해드리려고 합니다!
 
엑셀 파일 종류는 흔히 xlsx, csv 등이 있는데요. 이번 강좌에서는 가장 다루기 쉬운 csv 파일을 대상으로 설명하려 합니다. csv파일은 xlsx보다 간단한 형식(쉼표로 데이터 구분)이기 떄문에 접근하기 쉬우실 겁니다. 그럼 파이썬으로 csv 파일을 다루는 방법에 대해서 살펴보도록 합시다.
 
 
 

파이썬으로 csv 읽기

파이썬으로 csv파일을 읽기위해서는 csv 모듈을 불러와야 합니다. 이 외에도 판다스를 이용하여 csv를 읽고 처리하는 방법이 있지만 여기에서는 csv 모듈을 활용한 처리만 다루도록 하겠습니다.
 
csv모듈의 reader함수를 이용하여 행별로 데이터를 가져와 루프를 돌면 csv 파일을 읽습니다. 간단한 예제 코드는 아래와 같습니다. 
 
 

코드

import csv
 
f = open('example.csv','r')
rdr = csv.reader(f)
 
for line in rdr:
    print(line)
 
f.close()
 
해당 스크립트를 실행하면 아래와 같이 csv의 행단위로 데이터를 출력합니다.

결과

['사용자명', '지역']
['림코딩', '부산']
['김갑환', '서울']
['최번개', '강원']
['테리보가드', '경기']
 
각 line은 list 형식으로 되어있습니다.
그러므로 아래와 같이 해당 리스트의 인덱스를 지정하면 원하는 열만 가져올 수도 있습니다.
 

코드

for line in rdr:
    print(line[1])

결과

지역
부산
서울
강원
경기
 
 
 

파이썬으로 csv 쓰기

csv모듈을 이용하여 csv 파일을 쓰기 원한다면 writer함수를 사용하면 됩니다. open함수를 통해 파일명을 명시하고(writer.csv) 쓰기 모드를 옵션으로 주면(w) 해당 csv파일에다가 원하는 내용을 쓸 수 있습니다.
하지만 이대로 write를 해버리면 csv파일을 한 행씩 건너뛰면서 데이터를 넣게 되는 문제가 생깁니다. 이를 해결하기 위해 newline=''옵션을 주면 데이터가 띄어쓰기 없이 들어가게 됩니다. 코드는 아래와 같습니다.
 
 

코드

f = open('write.csv','w', newline='')
wr = csv.writer(f)
wr.writerow([1,'림코딩', '부산'])
wr.writerow([2,'김갑환', '서울'])
 
f.close()
 
마찬가지로 행단위로 들어갈때는 list 형식으로 넣게 됩니다.  위 코드를 실행하면 write.csv에 원하는 형식으로 들어가있는 것을 확인할 수 있습니다.
 
 

파이썬으로 csv 행 추가하기

기존에 있는 파일에 새로운 행을 추가할 수 있습니다. 이를 위해서는 파일 오픈시에 open함수에 append모드의 약자인 'a'옵션을 주면 해당 csv파일의 마지막행에 데이터를 추가할 수 있게 됩니다. 예제 코드는 아래와 같습니다.
 
f = open('write.csv','a', newline='')
wr = csv.writer(f)
wr.writerow([3,'최번개', '강원'])
 
f.close()
 
위 코드를 수행하면 마지막에 있던 행 (2,'김갑환', '서울') 아래 행에 데이터가 추가됩니다.
 
 
 

파이썬으로 csv 파일 수정하기

알고보니 '림코딩'의 지역은 서울이라서 림코딩에 해당하는 지역값들을 모두 서울로 바꾸고 싶다면 어떻게 해야할까요? 이를 위해서는 아래와 같이 example.csv에서 '림코딩'에 해당하는 열을 찾고 해당 열의 지역 데이터를 바꾼후 lines라는 새로운 리스트에 저장합니다. 마지막으로 저장된 lines를 writerows함수를 통하여 해당 파일에 덮어쓰면 해당 열이 수정된 채로 새로 파일이 저장됩니다.
 
 
f = open('example.csv','r')
rdr = csv.reader(f)
lines = []
for line in rdr:
    if line[0] == "림코딩":
        line[1] = "서울"
    lines.append(line)
 
f = open('example.csv','w',newline='') #원본을 훼손할 위험이 있으니 다른 파일에 저장하는 것을 추천합니다.
wr = csv.writer(f)
wr.writerows(lines)
 
f.close()
 
 
 
 
 
하지만 위 방법은 원본을 훼손할 수 있는 위험성이 있기 때문에, 임시파일로 데이터를 write한 후 데이터가 잘 들어갔는지 검사하고 다시 example.csv로 데이터를 옮기는 것이 안전합니다.