Python으로 CSV 파일을 효율적으로 다루는 방법을 배우는 것은 데이터 분석이나 보고서 작성 등 여러 용도에서 중요합니다. 특히, for 루프를 사용하여 각 행을 반복 처리함으로써 CSV 데이터를 직관적으로 다룰 수 있습니다. 본 기사에서는 Python의 표준 라이브러리 csv
를 활용하여 기본적인 사용법부터 효율적인 처리 방법까지 자세히 설명합니다. 이를 통해 대량의 데이터를 처리할 때 적합한 접근 방식을 이해할 수 있게 됩니다.
Python으로 CSV 파일을 여는 방법
CSV 파일을 다루기 위한 기본적인 단계는 파일을 열고, 적절하게 데이터를 읽는 것입니다. Python에서는 표준 라이브러리의 open
함수를 사용하여 CSV 파일을 엽니다.
기본적인 파일 여는 방법
Python의 open
함수를 사용하면 CSV 파일을 읽기 전용으로 열 수 있습니다. 다음 예시는 example.csv
라는 파일을 여는 코드입니다.
with open('example.csv', mode='r', encoding='utf-8') as file:
print(file.read())
with 문을 사용하는 이유
with
문을 사용하면 파일을 안전하게 열고 닫을 수 있어, 명시적으로 file.close()
를 호출할 필요가 없습니다. 이를 통해 에러가 발생해도 파일이 올바르게 닫히므로 리소스 유출을 방지할 수 있습니다.
CSV 모듈을 사용 준비
파일을 연 후, csv
모듈을 사용하여 파일의 내용을 처리합니다. 이 모듈은 쉼표로 구분된 데이터를 다루기 쉽게 읽을 수 있는 기능을 제공합니다. 다음 항목에서 구체적인 예시를 자세히 살펴보겠습니다.
csv.reader를 사용한 기본적인 반복 처리
csv
모듈의 reader
객체를 사용하면 CSV 파일을 행별로 반복 처리할 수 있습니다. 이 방법은 간단하고, 각 행을 리스트 형식으로 받아오기 때문에 쉽게 데이터 처리를 시작할 수 있습니다.
csv.reader의 기본적인 사용법
다음은 csv.reader
를 사용하여 CSV 파일을 읽는 기본적인 코드 예시입니다.
import csv
# CSV 파일을 열기
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file) # csv 리더 생성
for row in reader: # 각 행을 반복 처리
print(row) # 각 행의 리스트 출력
받은 데이터의 형식
csv.reader
에 의해 반환되는 row
는 각 셀의 데이터가 문자열로 저장된 리스트입니다. 예를 들어, 다음과 같은 CSV 파일을 처리한다고 가정해 봅시다:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
이 경우, 출력은 다음과 같습니다:
['Name', 'Age', 'City']
['Alice', '30', 'New York']
['Bob', '25', 'Los Angeles']
첫 번째 행(헤더) 건너뛰기
헤더 행을 건너뛰고 싶을 경우, next()
함수를 사용할 수 있습니다:
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 헤더 행 건너뛰기
for row in reader:
print(row)
주의사항
- 기본적으로
csv.reader
는 쉼표(,
)를 구분자로 인식합니다. 다른 구분자를 사용하는 경우delimiter
인자를 지정해야 합니다. - 데이터가 많을 경우 메모리 사용량을 고려하여 처리해야 합니다.
다음 항목에서는 각 열의 값을 추출하여 특정 처리를 수행하는 방법에 대해 설명합니다.
열 값을 추출하여 처리하는 방법
csv.reader
를 사용하면 각 행을 리스트로 받아올 수 있어, 특정 열의 값을 쉽게 추출하여 처리할 수 있습니다. 이 방법을 활용하면 필요한 데이터에 집중한 효율적인 처리가 가능합니다.
특정 열 추출의 기본 예
다음 코드는 특정 열(예: 두 번째 열의 데이터)을 추출하여 처리하는 예입니다:
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 헤더 건너뛰기
for row in reader:
# 두 번째 열(인덱스 1)의 값 추출
age = row[1]
print(f"Age: {age}")
예를 들어, 다음 CSV 파일을 실행하면:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
이 코드를 실행하면 다음과 같은 출력이 나옵니다:
Age: 30
Age: 25
여러 열을 결합하여 처리하기
여러 열을 동시에 사용하고 싶다면 필요한 열을 리스트의 인덱스로 지정하면 됩니다.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 헤더 건너뛰기
for row in reader:
name = row[0] # 첫 번째 열
city = row[2] # 세 번째 열
print(f"{name} lives in {city}.")
실행 결과:
Alice lives in New York.
Bob lives in Los Angeles.
에러 처리 추가하기
파일에 불완전한 데이터나 빈 셀이 있을 경우, 에러 처리를 추가하면 더 강력한 코드를 작성할 수 있습니다.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 헤더 건너뛰기
for row in reader:
try:
name = row[0]
age = int(row[1]) # 나이를 숫자로 변환
print(f"{name} is {age} years old.")
except (IndexError, ValueError) as e:
print(f"Error processing row: {row}, Error: {e}")
응용 예시
이 방법은 다음과 같은 실용적인 용도에 유용합니다:
- 특정 조건(예: 나이가 30세 이상)에 맞는 데이터 추출.
- 열 값 계산하여 새로운 정보 생성.
- 열별 통계(합계, 평균 등) 계산.
다음 항목에서는 csv.DictReader
를 사용하여 더 직관적으로 열 데이터를 다루는 방법을 설명합니다.
csv.DictReader를 사용한 행 데이터를 딕셔너리 형태로 처리하기
csv.DictReader
를 사용하면 CSV 파일의 각 행을 딕셔너리 형태로 다룰 수 있습니다. 이를 통해 열 이름을 키로 데이터에 접근할 수 있으므로 인덱스를 기억할 필요가 없고 코드의 가독성이 향상됩니다.
csv.DictReader의 기본 사용법
다음 코드는 csv.DictReader
를 사용하여 CSV 데이터를 처리하는 예시입니다:
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
# 열 이름을 키로 값 추출
name = row['Name']
age = row['Age']
city = row['City']
print(f"{name} is {age} years old and lives in {city}.")
예를 들어, 다음 CSV 파일을 사용하면:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
이 코드를 실행하면 다음과 같은 출력이 나옵니다:
Alice is 30 years old and lives in New York.
Bob is 25 years old and lives in Los Angeles.
열 이름을 사용하는 장점
- 코드 가독성 향상: 열 인덱스를 기억할 필요가 없으며, 열 이름을 직접 사용할 수 있어 코드가 직관적입니다.
- 유연성: 열 순서가 바뀌어도 열 이름만 맞다면 코드를 수정할 필요가 없습니다.
열 이름 자동 검출
csv.DictReader
는 파일의 첫 번째 행을 자동으로 헤더로 사용합니다. 다음과 같은 커스터마이즈도 가능합니다:
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file, fieldnames=['Name', 'Age', 'City']) # 사용자 정의 열 이름 지정
next(reader) # 첫 번째 행을 건너뛰기
for row in reader:
print(row)
데이터가 누락된 경우 처리
CSV 파일에 데이터가 누락된 경우, 해당 키의 값이 None
으로 처리됩니다. 에러를 피하려면 적절한 체크를 해주는 것이 좋습니다.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for
row in reader:
name = row.get('Name', 'Unknown') # 기본값 설정
age = row.get('Age', 'N/A')
print(f"Name: {name}, Age: {age}")
응용 예시
csv.DictReader
는 다음과 같은 시나리오에서 특히 유용합니다:
- 데이터 필터링: 특정 조건에 맞는 행을 선택하는 작업.
- JSON 변환: 딕셔너리 형식의 데이터를 그대로 JSON으로 변환하는 작업.
- 통계 처리: 열 이름을 기준으로 집계 처리하는 작업.
다음 항목에서는 CSV 파일의 인코딩에 관한 주의사항을 설명합니다.
CSV 파일의 인코딩에 관한 주의사항
CSV 파일을 Python으로 처리할 때 인코딩은 매우 중요한 요소입니다. 인코딩이 제대로 지정되지 않으면 데이터가 깨지거나 파일 읽기가 실패할 수 있습니다. 본 항목에서는 인코딩의 기본적인 사항과 자주 발생하는 문제, 적절한 처리 방법을 설명합니다.
자주 사용되는 인코딩 형식
다음은 CSV 파일에서 일반적으로 사용되는 인코딩 형식입니다:
- UTF-8: 국제적으로 널리 사용되며, 다국어 지원이 가능합니다. Python의 기본 인코딩 형식.
- Shift_JIS: 일본에서 많이 사용되지만, 일부 특수 문자에서 문제가 발생할 수 있습니다.
- ISO-8859-1: 서유럽 언어에서 주로 사용되는 인코딩 형식.
인코딩 지정 방법
Python의 open
함수를 사용할 때, encoding
인자를 통해 인코딩을 지정할 수 있습니다.
with open('example.csv', mode='r', encoding='utf-8') as file:
print(file.read())
만약 파일이 Shift_JIS
로 인코딩 되어 있다면, 다음과 같이 지정할 수 있습니다:
with open('example.csv', mode='r', encoding='shift_jis') as file:
print(file.read())
인코딩 에러 처리
잘못된 인코딩으로 에러가 발생한 경우, 다음 방법으로 처리할 수 있습니다.
`errors` 인자를 사용한 무시 또는 교체
errors
인자를 설정하면 인코딩 에러 시 동작을 제어할 수 있습니다.
with open('example.csv', mode='r', encoding='utf-8', errors='ignore') as file:
print(file.read()) # 에러 무시
with open('example.csv', mode='r', encoding='utf-8', errors='replace') as file:
print(file.read()) # 잘못된 문자를 교체
인코딩 자동 검출
파일의 인코딩이 불분명한 경우, chardet
또는 charset-normalizer
와 같은 라이브러리를 사용하면 유용합니다.
import chardet
# 인코딩 검출
with open('example.csv', mode='rb') as file:
result = chardet.detect(file.read())
print(result['encoding'])
인코딩을 의식한 운영 포인트
- 사전 확인: CSV 파일의 인코딩을 확인하고, 적절한 형식을 지정합니다.
- 표준화: 가능하면 UTF-8로 통일하여 운영합니다.
- 에러 핸들링:
errors
인자나 라이브러리를 활용해 예기치 않은 에러에 대비합니다.
다음 항목에서는 대용량 CSV 파일을 효율적으로 처리하는 방법에 대해 설명합니다.
큰 CSV 파일을 효율적으로 처리하는 방법
데이터 양이 매우 많은 CSV 파일을 처리할 때는 효율적인 방법을 사용하지 않으면 메모리 부족이나 처리 시간 증가와 같은 문제가 발생할 수 있습니다. Python에서는 대규모 CSV 파일을 처리하기 위한 다양한 기법들이 준비되어 있습니다.
행 단위로 읽어서 메모리 절약하기
Python의 csv.reader
나 csv.DictReader
를 사용하면 CSV 파일을 행 단위로 읽을 수 있습니다. 이를 통해 파일 전체를 메모리에 로드하지 않고 처리할 수 있으며, 메모리 소비를 최소화할 수 있습니다.
import csv
with open('large_file.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
# 각 행을 처리
print(row)
이 방법은 1행씩 처리되므로 파일 크기에 관계없이 동작합니다.
배치 처리를 활용하기
큰 CSV 파일을 나누어 한 번에 일정 수의 행을 처리하면 효율성을 더욱 향상시킬 수 있습니다. 아래는 itertools.islice
를 사용한 예입니다:
import csv
from itertools import islice
with open('large_file.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
while True:
batch = list(islice(reader, 100)) # 100행씩 읽기
if not batch:
break
# 배치 처리 실행
for row in batch:
print(row)
Pandas를 이용한 분할 처리
Python의 pandas
라이브러리는 대규모 데이터셋을 처리하는 데 적합합니다. chunk_size
인자를 지정하여 분할 처리를 할 수 있습니다.
import pandas as pd
for chunk in pd.read_csv('large_file.csv', chunksize=1000, encoding='utf-8'):
# 각 청크 처리
print(chunk)
이 방법은 CSV 데이터를 작은 조각으로 나누어 효율적으로 분석할 때 유용합니다.
병렬 처리 활용하기
파일을 나누어 병렬 처리하면 처리 속도를 향상시킬 수 있습니다. 아래는 multiprocessing
모듈을 사용한 예입니다:
import csv
from multiprocessing import Pool
def process_chunk(chunk):
for row in chunk:
print(row)
def split_file(filename, chunk_size=1000):
with open(filename, mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
batch = []
for i, row in enumerate(reader):
batch.append(row)
if (i + 1) % chunk_size == 0:
yield batch
batch = []
if batch:
yield batch
if __name__ == "__main__":
filename = 'large_file.csv'
with Pool(4) as pool: # 4 프로세스로 병렬 처리
pool.map(process_chunk, split_file(filename))
효율적인 데이터 형식 선택
CSV는 간단하고 유용하지만, 데이터가 매우 클 경우 다른 형식(예: Parquet나 Feather)을 고려하는 것도 효과적입니다. 이러한 형식은 읽기 속도나 압축률에서 CSV를 능가할 수 있습니다.
실용 예시: 필터링하면서 데이터 저장하기
특정 조건에 맞는 데이터만 추출하여 메모리를 효율적으로 사용해 저장하는 예시입니다:
import csv
with open('large_file.csv', mode='r', encoding='utf-8') as infile, \
open('filtered_file.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
if int(row[1]) > 50: # 조건: 2번째 열의 값이 50을 초과
writer.writerow(row)
다음 항목에서는 with
구문을 사용한 안전한 파일 작업에 대해 설명합니다.
with 구문을 사용한 안전한 파일 작업
Python에서 파일을 작업할 때, with
구문을 사용하면 파일을 안전하게 열고 닫을 수 있어 리소스 관리가 간편해집니다. 특히 CSV 파일을 처리할 때, 오류가 발생하더라도 파일이 적절하게 닫히므로 시스템 리소스 낭비를 방지할 수 있습니다.
with 구문을 사용한 기본 예시
다음은 with
구문을 사용하여 CSV 파일을 읽는 기본적인 코드입니다:
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)
이 코드에서는 with
구문의 블록을 벗어나면 file
객체가 자동으로 닫힙니다. close()
메서드를 명시적으로 호출할 필요가 없어 코드가 간단해집니다.
파일에 쓰기 시 사용 예시
CSV 파일에 데이터를 쓸 때도 with
구문을 사용하면 안전하게 작업할 수 있습니다:
import csv
data = [
['Name', 'Age', 'City'],
['Alice', '30', 'New York'],
['Bob', '25', 'Los Angeles']
]
with open('output.csv', mode='w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
with 구문을 사용하는 장점
- 리소스 관리 간소화
파일 작업 중 오류가 발생하더라도with
구문을 사용하면 파일이 자동으로 닫힙니다. - 가독성 향상
파일을 열고 닫는 부분을 명시적으로 작성할 필요가 없어 코드가 간결하고 이해하기 쉬워집니다. - 오류 방지
파일을 닫지 않아 리소스 누수(메모리 사용 증가 등)가 발생하는 것을 방지할 수 있습니다.
여러 파일을 동시에 작업하기
with
구문을 사용하면 여러 파일을 동시에 안전하게 작업할 수 있습니다:
import csv
with open('input.csv', mode='r', encoding='utf-8') as infile, \
open('output.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
writer.writerow(row)
보충: `with` 구문을 사용하지 않을 경우의 리스크
다음은 with
구문을 사용하지 않고 파일 작업을 하는 예입니다:
file = open('example.csv', mode='r', encoding='utf-8')
reader = csv.reader(file)
for row in reader:
print(row)
file.close()
이 방법에서는 file.close()
를 잊거나 오류가 발생하면 파일이 닫히지 않아서 리소스 누수의 원인이 됩니다. 특히 서버나 대규모 애플리케이션에서는 심각한 문제가 될 수 있습니다.
실용 예시: 데이터 필터링 및 저장
다음 예시에서는 with
구문을 사용하여 CSV 파일에서 조건에 맞는 데이터를 추출하고 새로운 파일에 저장합니다:
import csv
with open('input.csv', mode='r', encoding='utf-8') as infile, \
open('filtered_output.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
if row[1] == '30': # 조건: 2번째 열의 값이 '30'
writer.writerow(row)
다음 항목에서는 CSV 데이터의 실용 예시로 특정 열을 추출하고 새로운 파일에 저장하는 방법을 설명합니다.
실용 예시: CSV 파일에서 특정 열을 추출하여 저장하는 방법
CSV 파일을 처리할 때 특정 열만 추출하여 새로운 CSV 파일에 저장하는 작업은 자주 발생하는 작업입니다. Python의 csv
모듈을 사용하면 간단하고 효율적으로 구현할 수 있습니다. 이 섹션에서는 그 구체적인 방법을 설명합니다.
특정 열을 추출하여 저장하는 기본 예시
다음 코드는 CSV 파일에서 특정 열(예: 이름과 나이)을 추출하여 새로운 파일에 저장하는 예시입니다:
import csv
# 입력 파일과 출력 파일 경로
input_file = 'input.csv'
output_file = 'output.csv'
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
# 헤더 처리 (특정 열만 추출)
header = next(reader)
selected_columns = [0, 1] # 추출할 열(예: 1열과 2열)
writer.writerow([header[i] for i in selected_columns])
# 각 행에서 특정 열을 추출하여 작성
for row in reader:
writer.writerow([row[i] for i in selected_columns])
예시: 입력 파일의 내용
입력 파일 input.csv
의 내용:
Name,Age,City,Country
Alice,30,New York,USA
Bob,25,Los Angeles,USA
Charlie,35,London,UK
이 코드를 실행하면 출력 파일 output.csv
에는 다음과 같은 내용이 기록됩니다:
Name,Age
Alice,30
Bob,25
Charlie,35
열을 동적으로 지정하여 추출하기
열 이름을 사용하여 동적으로 열을 추출하는 방법도 유용합니다. 이 경우 열 이름과 인덱스를 자동으로 매핑할 수 있습니다.
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.DictReader(infile)
writer = csv.writer(outfile)
# 추출할 열 이름
columns_to_extract = ['Name', 'City']
writer.writerow(columns_to_extract)
# 각 행에서 지정된 열을 추출하여 작성
for row in reader:
writer.writerow([row[col] for col in columns_to_extract])
조건에 맞는 열 추출하기
또한 특정 조건을 만족하는 데이터만 추출할 수 있습니다:
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.DictReader(infile)
writer = csv.DictWriter(outfile, fieldnames=['Name', 'City'])
writer.writeheader()
for row in reader:
if int(row['Age']) > 30: # 나이가 30 이상인 데이터만 추출
writer.writerow({'Name': row['Name'], 'City': row['City']})
출력 파일의 내용은 다음과 같습니다:
Name,City
Charlie,London
응용 예시
- 데이터 분석:특정 데이터를 추출하여 집계나 분석 준비를 한다.
- 데이터 변환:필요한 데이터만 추출하여 다른 형식으로 변환한다.
- 효율적인 보고서 작성:대규모 데이터셋에서 중요한 정보를 추출하여 간단한 보고서를 작성한다.
다음 항목에서는 지금까지의 내용을 요약해봅니다.
요약
이번 글에서는 Python을 사용하여 CSV 파일을 효율적으로 처리하는 방법을 설명했습니다. csv.reader
를 사용한 기본적인 행 반복부터 csv.DictReader
를 이용한 사전 형식 처리, 특정 열 추출 및 대규모 파일 처리 방법까지 다뤘습니다. 또한 인코딩 처리와 with
구문을 활용한 안전한 파일 작업도 다뤄 실제적인 기술을 제공했습니다.
이 지식을 활용하면 데이터 분석이나 ETL(Extract, Transform, Load) 등 다양한 데이터 처리 작업을 효율화할 수 있습니다. Python의 유연성을 살려 CSV 데이터 처리를 원활하게 진행하세요.