CSV 파일로 데이터 다루기

최기환·2022년 4월 9일
0

Python

목록 보기
1/1

CSV 파일로 데이터 다루기

4-1 CSV 데이터 알아보기

CSV 파일이란

CSV(Comma Seprated Value)는 쉼표로 나눠진 값을 정장한 데이터를 의미한다. CSV는 엑셀에서도 활용할 수 있고, 글꼴과 같은 서식 정보들이 없기 때문에 조금 더 원형 그대로 가공하기가 좋은 데이터 형식입니다. 텍스트 에디터 등으로도 쉽게 만들 수 있다는 것도 장점입니다.

CSV 파일 만들고 읽기

엑셀을 열러 간단한 값을 입력하고, csv형식으로 저장한다.


vs코드에서 열어 본 모습이다.

텍스트에 그냥 쉼표를 넣어 구분한 뒤 CSV로 강제 저장하는 방법도 있다.

잘 저장 되어 있다.

이와 같이 CSV는 텍스트 에디터에서도 쉽게 엑셀 파일을 만들 수 있고, 엑셀 파일의 자료를 파일로 옮기기도 수월하다.

4-2 파이썬으로 CSV 파일 읽고 쓰기

파이썬으로 CSV 파일을 읽으려면 csv 모듈을 사용하면 된다. 넘파이(numpy) 모듈에서 배열(matrix)을 정의하는 방식과 같이 정리하여야 한다. 이 책에서는 이와 같은 리스트를 'CSV형'이라고 부른다. CSV형의 기본 형태는 다음과 같다.

CSV형 리스트 = [[1행], [2행], [n행]]

첫 번째 리스트는 첫 번째 행으로, 두 번째 리스트는 두 번째 행으로 인식된다.
CSV 파일을 파이썬으로 불러오는 것을 '읽다(read)'라고 하고, 파이썬으로 가공한 파일을 CSV 파일로 저장하는 것을 '쓰다(write)'라고 표현한다. 이 개념을 정확하게 이해해야 나중에 csv 모듈을 사용해 명령을 구현할 때 헷갈리지 않을 수 있다.

CSV 파일 읽기

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
f = open('a.csv', 'r', encoding='utf-8')
print(f)
>>><_io.TextIOWrapper name='a.csv' mode='r' encoding='utf-8'>

CSV 파일을 저장한 객체를 파이썬에서 읽으려면 csv.reader을 사용한다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
f = open('a.csv', 'r')
new = csv.reader(f)
print(new)
>>> <_csv.reader object at 0x0000028E5DDE1EE0>
for i in new:
    print(i)
>>>
['국어', '영어', '수학']
['90', '80', '100']

파이썬에서 사용할 수 있도록 CSV형 리스트로 바꾼다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
f = open('a.csv', 'r')
new = csv.reader(f)
f.seek(0)  # 커서를 파일 가장 첫 번째 위치로 이동 시킨다
a_list = []
for i in new:
    a_list.append(i)
print(a_list)
>>> [['국어', '영어', '수학'], ['90', '80', '100']]

굳이 파이썬으로 CSV 파일의 내용을 블러와 CSV형 리스트로 바꾸는 이유는 파이썬의 리스트가 가진 화려한 기능을 사용해 할 수 있는 연산과 작업이 무궁무진하게 많기 때문이다. 예를 들어 조건문으로 특정한 숫자나 조건을 포함한 행만 출력할 수 있다.

하지만 매번 이런 번거러운 작업을 한다면 귀찮은 일이다. 앞에서 배운 함수 만드는 방법을 이용해 이 작업을 함수로 만들어 두면 편하게 사용할 수 있다.
opencsv라는 이름의 함수로 저장해서 매번 사용해 보자.

def opencsv(filename):
    f = open(filename, 'r')
    reader = csv.reader(f)
    output = []
    for i in reder:
        output.append(i)
    return output

살짝 복잡한 형태의 csv파일로 잘 작동하는지 확인 해보자.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')


def opencsv(filename):
    f = open(filename, 'r')
    reader = csv.reader(f)
    output = []
    for i in reader:
        output.append(i)
    return output


print(opencsv('example2.csv'))
>>>[['이름', '국어', '영어', '수학'], ['a', '90', '80', '100'], ['b', '80', '90', '90'], ['c', '100', '80', '60']]

지금까지 CSV파일을 파이썬으로 읽어오는 과정을 정리하면 다음과 같다.
1. 가공하고 싶은 CSV파일이 저장된 경로로 이동한다.
2. CSV 파일을 읽기 모드로 연다.
3. csv.reader()로 CSV파일 내용을 읽는다.
4. 읽은 자료를 CSV형 리스트로 변환해 새 객체에 저장한다.

CSV 파일 쓰기

CSV 파일 쓰는 법을 연습해 보자. 먼저 CSV형 리스트를 만들어 본다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
a = [['구', '전체', '내국인', '외국인'],
     ['관악구', '519864', '502089', '17775'],
     ['강남구', '547602', '542498', '5104'],
     ['송파구', '681181', '6790246', '6934'],
     ['강동구', '42867', '424345', '4321']]

쓰기 모드로 만들어서 연다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
a = [['구', '전체', '내국인', '외국인'],
     ['관악구', '519864', '502089', '17775'],
     ['강남구', '547602', '542498', '5104'],
     ['송파구', '681181', '6790246', '6934'],
     ['강동구', '42867', '424345', '4321']]
f = open('abc.csv', 'w', newline ='')   #newline=''을 open함수에 입력하여야 한다 / 입력하지 않으면 줄바꿈이 한 번 더 일어나서 나중에 별도로 편집해야 한다

csv.writer()는 CSV형 리스트를 파일에 쓸 수 있게 만들어 준다. csv.writer()에 객체 f를 입력한 값을 csvobject 객체에 저장한다. 이때 delimiter = ','로 지정한다. 사용할 CSV형 리스트의 원소가 쉼표(,)로 구분되어 있을 때는 생략해도 명령이 작동한다. (만약 CSV형 리스트의 원소가 세미콜론(;)로 구분되어 있다면 delimiter = ';'를 넣어준다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
a = [['구', '전체', '내국인', '외국인'],
     ['관악구', '519864', '502089', '17775'],
     ['강남구', '547602', '542498', '5104'],
     ['송파구', '681181', '6790246', '6934'],
     ['강동구', '42867', '424345', '4321']]
f = open('abc.csv', 'w', newline ='')   #newline=''을 open함수에 입력하여야 한다 / 입력하지 않으면 줄바꿈이 한 번 더 일어나서 나중에 별도로 편집해야 한다
csvobject = csv.writer(f, delimiter =',')

CSV형 리스트가 저장된 개겣를 파일에 쓸 때는 writerows()를 사용한다. 한 줄씩 따로 입력할 때는 writerow()를 사용할 수도 있으나, 대부분 CSV 파일을 만들 때 완성된 리스트 형태로 자료를 만든 다음에 한 번에 입력하므로 writerows()를 주로 사용한다.

마지막으로 csvobject.writerows(a)를 입력해 CSV 파일 안에 미리 준비안 CSV형 리스트a를 저장한다.

import csv
import os
os.chdir(r'C:\Users\rlghk\OneDrive\바탕 화면\python\Doit!_파이썬생활프로그래밍_소스\my practice')
a = [['구', '전체', '내국인', '외국인'],
     ['관악구', '519864', '502089', '17775'],
     ['강남구', '547602', '542498', '5104'],
     ['송파구', '681181', '6790246', '6934'],
     ['강동구', '42867', '424345', '4321']]
# newline=''을 open함수에 입력하여야 한다 / 입력하지 않으면 줄바꿈이 한 번 더 일어나서 나중에 별도로 편집해야 한다
f = open('abc.csv', 'w', newline='')
csvobject = csv.writer(f, delimiter=',')
csvobject.writerows(a)
f.close

확인해보자.

잘 저장되어 있음을 알 수 있다.
파일을 읽을 때와 마찬가지로 쓰는 과정도 다음과 같이 함수로 저장해보자.

def writecsv(filename, the_list):
    with open(filename, 'w', newline='') as f:
        a = csv.writer(f, delimiter=',')
        a.writerows(the_list)
  1. CSV형 리스트를 만들어 객체에 저장한다.
  2. 파일을 쓰기 모드(w)로 생성해 객체에 저장한다.
  3. 파일을 생성한 객체에 csv.writer()를 사용해 csv 객체를 연다.
  4. writerows()로 쓰기 모드로 연 파일에 CSV형 리스트를 쓴 다음 파일을 닫는다.

나만의 모듈을 만들어 사용하기

opencsv() 함수와 writecsv() 함수는 쓰임새가 매우 많으니 이제부터 두 함수를 묶어 usecsv라는 별도의 모듈로 만들어 사용하겠다.
1. usecsv.pu 파일에 opencsv(), writecsv() 함수 입력하기

profile
꾸준히 한걸음씩

0개의 댓글