본문으로 건너뛰기

02-002. 파일 기반 데이터 처리

파일 기반 데이터 처리

파일 기반 데이터 처리는 데이터 분석에서 가장 기본적이면서도 중요한 작업이다. 대부분의 데이터는 CSV, Excel, JSON, XML 등의 파일 형태로 제공된다. 이러한 파일들을 읽고 처리하는 데이터 분석에는 필수적인 역량이다.

CSV 파일 다루기

CSV(Comma-Separated Values)는 데이터 교환에서 가장 널리 사용되는 형식 중 하나다. 단순하고 가벼우며 대부분의 도구에서 지원한다.

기본적인 CSV 읽기

import pandas as pd

# 기본적인 CSV 파일 읽기
df = pd.read_csv('ch02_data.csv')
print(df.head())

# 파일 정보 확인
print(f"데이터 형태: {df.shape}")
print(f"컬럼명: {list(df.columns)}")
print(f"데이터 타입:\n{df.dtypes}")
   고객ID  고객명  지역  나이 성별        구매일자 상품카테고리        상품명  수량       단가       총액  \
0 C001 김민준 서울 28 남 2025-01-15 전자제품 노트북 1 1500000 1500000
1 C002 이서연 부산 35 여 2025-01-16 의류 겨울코트 2 150000 300000
2 C003 박서준 서울 42 남 2025-01-17 도서 파이썬 프로그래밍 3 25000 75000
3 C004 최지우 대구 29 여 2025-01-18 전자제품 스마트폰 1 800000 800000
4 C005 정하준 인천 33 남 2025-01-19 식품 유기농 쌀 5 15000 75000

결제방법
0 신용카드
1 현금
2 신용카드
3 카드
4 현금
데이터 형태: (30, 12)
컬럼명: ['고객ID', '고객명', '지역', '나이', '성별', '구매일자', '상품카테고리', '상품명', '수량', '단가', '총액', '결제방법']
데이터 타입:
고객ID object
고객명 object
지역 object
나이 int64
성별 object
구매일자 object
상품카테고리 object
상품명 object
수량 int64
단가 int64
총액 int64
결제방법 object
dtype: object

pandas.read_csv() 주요 옵션들

# 주요 옵션들을 활용한 CSV 읽기
import pandas as pd
df = pd.read_csv(
'ch02_data.csv',
sep=',', # 구분자 지정 (기본값: ',')
header=0, # 헤더 행 지정 (0: 첫 번째 행)
names=['고객ID', '고객명', '지역', '나이', '성별', '구매일자', '상품카테고리', '상품명', '수량', '단가', '총액', '결제방법'], # 컬럼명 직접 지정
index_col=0, # 인덱스로 사용할 컬럼
usecols=[0, 1, 3], # 특정 컬럼만 읽기
dtype={'col1': str}, # 데이터 타입 지정
skiprows=1, # 건너뛸 행 수
nrows=1000, # 읽을 행 수 제한
na_values=['N/A', 'NULL'], # 결측치로 처리할 값들
encoding='utf-8' # 인코딩 지정
)
df.head()

인코딩 문제 해결

한글 데이터를 다룰 때 자주 발생하는 인코딩 문제 해결 방법이다.

# 다양한 인코딩 시도
def read_csv_with_encoding(file_path):
encodings = ['utf-8', 'cp949', 'euc-kr', 'latin-1']

for encoding in encodings:
try:
df = pd.read_csv(file_path, encoding=encoding)
print(f"성공: {encoding}")
return df
except UnicodeDecodeError:
print(f"실패: {encoding}")
continue

raise ValueError("모든 인코딩으로 읽기 실패")

# 사용 예시
df = read_csv_with_encoding('korean_data.csv')

대용량 CSV 청크 단위 처리

# 청크 단위로 파일 읽기
def process_large_csv(file_path, chunk_size=10000):
chunks = []

for chunk in pd.read_csv(file_path, chunksize=chunk_size):
# 각 청크에 대해 처리 수행
processed_chunk = chunk[chunk['value'] > 100]
chunks.append(processed_chunk)

# 모든 청크 결합
result = pd.concat(chunks, ignore_index=True)
return result

# 사용 예시
result = process_large_csv('large_file.csv')

Excel 파일 다루기

Excel 파일은 비즈니스 환경에서 매우 흔하게 사용되는 형식이다.

기본적인 Excel 읽기

# Excel 파일 읽기
df = pd.read_excel('data.xlsx')

# 특정 시트 읽기
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 여러 시트 동시에 읽기
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
for sheet_name, df in all_sheets.items():
print(f"시트: {sheet_name}, 행 수: {len(df)}")

다중 시트 처리와 병합

def merge_excel_sheets(file_path):
"""여러 시트를 하나의 DataFrame으로 병합"""
all_sheets = pd.read_excel(file_path, sheet_name=None)
merged_df = pd.DataFrame()

for sheet_name, df in all_sheets.items():
df['source_sheet'] = sheet_name # 출처 시트 정보 추가
merged_df = pd.concat([merged_df, df], ignore_index=True)

return merged_df

# 사용 예시
merged_data = merge_excel_sheets('monthly_reports.xlsx')

JSON 데이터 처리

JSON은 웹 API에서 가장 많이 사용되는 데이터 형식이다:

import json

# 기본적인 JSON 읽기
with open('data.json', 'r', encoding='utf-8') as f:
json_data = json.load(f)

# JSON을 DataFrame으로 변환
df = pd.json_normalize(json_data)

# 중첩된 JSON 구조 처리 예시
nested_json = {
"users": [
{
"id": 1,
"name": "김철수",
"address": {"city": "서울", "district": "강남구"},
"hobbies": ["독서", "영화감상"]
}
]
}

# 중첩 구조 정규화
df_normalized = pd.json_normalize(nested_json['users'])
print(df_normalized)

압축 파일 처리

ZIP 파일 처리

import zipfile

def process_zip_file(zip_path):
"""ZIP 파일 내의 모든 CSV 파일을 처리"""
dataframes = {}

with zipfile.ZipFile(zip_path, 'r') as zip_ref:
file_list = zip_ref.namelist()
print(f"ZIP 파일 내용: {file_list}")

for file_name in file_list:
if file_name.endswith('.csv'):
with zip_ref.open(file_name) as csv_file:
df = pd.read_csv(csv_file)
dataframes[file_name] = df

return dataframes

실무 팁과 모범 사례

강건한 파일 읽기 함수

def robust_file_reader(file_path):
"""강건한 파일 읽기 함수"""
try:
if file_path.endswith('.csv'):
# 여러 인코딩 시도
for encoding in ['utf-8', 'cp949', 'latin-1']:
try:
df = pd.read_csv(file_path, encoding=encoding)
print(f"CSV 파일 읽기 성공 (인코딩: {encoding})")
return df
except UnicodeDecodeError:
continue
raise ValueError("모든 인코딩으로 읽기 실패")

elif file_path.endswith(('.xlsx', '.xls')):
df = pd.read_excel(file_path)
print("Excel 파일 읽기 성공")
return df

elif file_path.endswith('.json'):
with open(file_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
df = pd.json_normalize(json_data)
print("JSON 파일 읽기 성공")
return df

except FileNotFoundError:
print(f"파일을 찾을 수 없습니다: {file_path}")
return None
except Exception as e:
print(f"파일 읽기 중 오류 발생: {str(e)}")
return None

# 사용 예시
df = robust_file_reader('data.csv')

파일 형식 변환

def convert_file_format(input_path, output_path, output_format):
"""파일 형식 변환 함수"""
df = robust_file_reader(input_path)

if df is None:
return False

try:
if output_format.lower() == 'csv':
df.to_csv(output_path, index=False, encoding='utf-8-sig')
elif output_format.lower() == 'excel':
df.to_excel(output_path, index=False)
elif output_format.lower() == 'json':
df.to_json(output_path, orient='records', force_ascii=False, indent=2)

print(f"파일 변환 완료: {input_path} -> {output_path}")
return True

except Exception as e:
print(f"파일 변환 중 오류 발생: {str(e)}")
return False

정리

파일 기반 데이터 처리는 데이터 분석의 첫 번째 관문이다. 각 파일 형식의 특성을 이해하고 적절한 방법으로 처리하는 것이 중요하다. 특히 한국어 데이터를 다룰 때는 인코딩 문제를 항상 염두에 두어야 하며, 대용량 파일을 처리할 때는 메모리 효율성을 고려해야 한다.

다음 섹션에서는 데이터베이스 연결과 SQL 활용에 대해 알아보겠다.