CSV의 개념과 파이썬 활용법
CSV(Comma-Separated Values)
는 간단한 텍스트 형식으로 데이터를 저장하고 교환하는 데 사용됩니다.
CSV 파일은 표 형식의 데이터를 텍스트로 저장하며, 각 데이터 필드는 쉼표(,)
로 구분됩니다.
이름,나이,도시
홍길동,24,서울
박민주,30,부산
CSV는 스프레드시트 프로그램(예: Microsoft Excel, Google Sheets) 및 데이터베이스 관리 시스템과 호환됩니다.
CSV의 기본 구조
헤더
: 파일의 첫 번째 줄은 옵션으로, 각 열(column)의 이름을 포함할 수 있습니다. 헤더는 데이터를 해석하는 데 도움을 줍니다.
레코드(행)
: 각 행은 하나의 데이터 레코드를 나타냅니다. 일반적으로 데이터베이스의 하나의 엔트리나 객체를 의미합니다.
필드(열)
: 행 내의 각 데이터 항목은 필드라고 하며, 쉼표로 구분됩니다. 이 필드들은 각각의 데이터 포인트를 나타냅니다.
CSV 파일 읽기 및 쓰기
파이썬의 csv
내장 모듈을 사용하면 CSV 파일을 쉽게 읽고 쓸 수 있습니다.
csv.reader
: CSV 파일 읽기
csv.reader
는 CSV 파일을 읽기 위한 객체를 생성합니다.
이 객체는 파일 내의 각 레코드(행)을 순회하며, 각 레코드를 필드(열)의 리스트로 변환하여 반환합니다. 기본적으로 데이터는 쉼표로 구분되지만, 다른 구분자도 지정할 수 있습니다.
import csv
with open('example.csv', 'r', newline='') as file:
reader = csv.reader(file)
for row in reader:
print(row)
위 코드는 example.csv 파일을 열고, 파일의 각 행을 출력합니다.
newline=''는 파일을 열 때 권장되는 방식으로, 플랫폼에 관계없이 일관된 개행 문자(줄바꿈) 처리를 위해 사용됩니다.
csv.writer
: CSV 파일 쓰기
csv.writer
는 CSV 파일에 데이터를 쓰기 위한 객체를 생성합니다.
이 객체를 사용하여 데이터 필드를 포함한 행을 CSV 파일에 쓸 수 있습니다. csv.writer 역시 기본적으로 쉼표를 필드 구분자로 사용하지만, 필요에 따라 변경할 수 있습니다.
import csv
with open('output.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['name', 'age', 'city'])
writer.writerow(['John Doe', '30', 'New York'])
writer.writerow(['Jane Smith', '25', 'Los Angeles'])
이 코드는 새로운 output.csv 파일을 생성하고, 각 행에 데이터를 쓰기 위해 writerow 메소드를 사용합니다.
첫 번째 writerow 호출은 헤더
행을 작성하고, 이후 호출에서는 데이터 행을 추가합니 다.
csv 모듈의 다른 기능들
-
csv.DictReader
: CSV 파일을 딕셔너리 객체로 읽어들입니다. -
csv.DictWriter
: 사전 객체를 CSV 파일로 작성합니다.
DictReader, DictWriter 예제
# 동일한 파일 경로의 xample.csv 파일을 딕셔너리로 읽기
with open('example.csv', 'r') as file:
csv_reader = csv.DictReader(file)
# 각 행을 출력
for row in csv_reader:
print(row)
# 필드명
fieldnames = ['name', 'age', 'city']
# 데이터
rows = [
{'name': '김철수', 'age': 20, 'city': '대전'},
{'name': '이영희', 'age': 22, 'city': '광주'}
]
with open('output_dict.csv', 'w', newline='') as file:
# 필드명을 지정
csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
# 헤더 작성
csv_writer.writeheader()
# 데이터 작성
for row in rows:
csv_writer.writerow(row)