본문으로 건너뛰기
김신건의 로그

[Pandas] read_csv / to_csv

· 수정 · 📖 약 1분 · 353자/단어 #python #pandas #io #csv
Pandas read_csv, Pandas to_csv, CSV pandas

정의

pandas.read_csv 는 CSV (Comma-Separated Values) 파일 또는 비슷한 텍스트 형식을 Pandas DataFrame 으로 읽는 함수. pandas 사용의 99% 가 여기서 시작.

대응 출력 함수는 DataFrame.to_csv.

기본 사용

import pandas as pd

df = pd.read_csv('data.csv')
df.to_csv('out.csv', index=False)

핵심 옵션

옵션의미
sep / delimiter구분자 (기본 ,)
header헤더 행 위치 (기본 0)
names컬럼 이름 지정 (header 없을 때)
index_col인덱스로 쓸 컬럼
usecols일부 컬럼만
dtype컬럼별 타입 강제
parse_dates날짜 자동 파싱
na_valuesNA 로 취급할 값
nrows처음 N 행만
skiprows건너뛸 행
encoding인코딩 (utf-8, cp949, latin1)
chunksize청크 단위로 읽기

자주 쓰는 패턴

tab 구분 / 인코딩

df = pd.read_csv('data.tsv', sep='\t', encoding='utf-8')
df = pd.read_csv('korean.csv', encoding='cp949')   # 한글 Windows

일부 컬럼만, 타입 지정

python
import io
csv_text = """id,name,age,salary
1,Alice,30,3000
2,Bob,25,4500
3,Charlie,35,6000"""

df = pd.read_csv(
  io.StringIO(csv_text),
  usecols=['id', 'name', 'age'],
  dtype={'id': 'int32', 'age': 'int8'},
)
print(df)
print(df.dtypes.tolist())
결과
   id     name  age
0   1    Alice   30
1   2      Bob   25
2   3  Charlie   35
[dtype('int32'), dtype('O'), dtype('int8')]

날짜 파싱

df = pd.read_csv('events.csv', parse_dates=['created_at', 'updated_at'])
df = pd.read_csv('events.csv', parse_dates={'datetime': ['date', 'time']})

큰 파일을 청크로

total = 0
for chunk in pd.read_csv('huge.csv', chunksize=100_000):
    total += chunk['amount'].sum()
print(total)

전체를 한 번에 메모리에 올리지 않고 100K 행씩 처리.

NA 처리

df = pd.read_csv('data.csv', na_values=['', 'NULL', 'N/A', '-'])
# 위 값들이 모두 NaN 으로 변환됨

저장 (to_csv)

df.to_csv('out.csv', index=False)               # index 안 쓰기 (가장 흔함)
df.to_csv('out.csv', encoding='utf-8-sig')      # Excel 한글 호환 BOM
df.to_csv('out.tsv', sep='\t')
df.to_csv('out.csv.gz', compression='gzip')     # 자동 압축

자주 만나는 함정

1. index 가 0,1,2… 로 추가됨

df.to_csv('out.csv')             # 첫 열에 0,1,2... 가 있음
df.to_csv('out.csv', index=False) # ✓ 보통 이걸 원함

2. 정수 컬럼이 float 으로 변함

NaN 이 하나라도 있으면 정수 타입을 유지 못 함 (NaN 이 float). 해법:

  • pandas 1.x+ : Int64 (nullable integer)
  • df['x'] = df['x'].astype('Int64')

3. 큰 파일의 메모리 폭주

  • dtype 명시로 메모리 절약 (int8, category)
  • usecols 로 필요한 컬럼만
  • chunksize 로 스트리밍

4. 한글 깨짐

  • Windows 에서 만든 CSV → encoding='cp949'
  • Mac/Linux → encoding='utf-8' 기본
  • BOM 있는 UTF-8 → encoding='utf-8-sig'

참고

이 글의 용어 (3개)
[Pandas] DataFramepandas
정의 은 2차원 레이블 테이블. 각 열이 , 모든 열이 같은 (행 라벨) 를 공유. SQL 테이블 / Excel 시트 / R data.frame 의 Python 대응체. 생성 <…
[Pandas] read_excel / to_excelpandas
정의 는 Excel 파일 (.xlsx, .xls) 을 으로 읽는 함수. 한국 실무에서 매우 자주 쓰인다. 의존 라이브러리 | 형식 | 필요한 패키지 | |:---|:---| | …
[Pandas] read_json / to_jsonpandas
정의 은 JSON 문자열 또는 파일을 으로 변환. orient 파라미터가 핵심, JSON 구조를 어떻게 해석할지 결정한다. orient 옵션 비교 | orient | 구조 | 적…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기