본문 바로가기
카테고리 없음

CSV 파일 자동 정리: 깨진 열·공백·인코딩을 한 번에 다루는 실무 가이드

by danie 2026. 9. 1.

CSV 파일 자동 정리: 깨진 열·공백·인코딩을 한 번에 다루는 실무 가이드

CSV를 다룰 때 가장 흔한 문제는 세 가지입니다. 열 개수가 맞지 않는 행, 구분자 뒤에 붙은 공백, 그리고 인코딩 문제입니다. 이 글은 **완전 자동 복구**가 아니라, **읽기 단계에서 문제를 최대한 통제하고 그다음 후처리로 정리하는 방식**을 소개합니다.

먼저 결론

실무에서는 `pandas.read_csv()`의 파라미터로 읽기 동작을 제어하고, 읽은 뒤에 컬럼명·값 공백 제거와 타입 점검을 추가하는 흐름이 안전합니다. 특히 bad line 처리는 모든 손상을 고치는 만능 기능이 아니므로, 스킵이나 변형을 쓸 때는 데이터 손실 가능성을 반드시 확인해야 합니다.

1) CSV가 자주 깨지는 지점

CSV가 망가져 보이는 이유는 보통 다음과 같습니다.

  • 열 개수 불일치로 인해 일부 행이 깨짐
  • 구분자 뒤 공백 때문에 값이 들쭉날쭉해짐
  • 파일 인코딩이 맞지 않아 디코딩 오류가 발생함

이 셋은 각각 다른 방식으로 다뤄야 합니다. 한 번에 “자동 복구”하려고 하기보다, 읽기 옵션을 먼저 맞추는 편이 낫습니다.

2) 읽기 단계에서 먼저 조정할 옵션

`pandas.read_csv()`는 malformed rows, whitespace after delimiters, encoding handling에 직접 관련된 파라미터를 제공합니다. 여기서 핵심은 아래 네 가지입니다.

  • `skipinitialspace=True`
  • `encoding=...`
  • `encoding_errors=...`
  • `on_bad_lines=...`

예시

```python

import pandas as pd

df = pd.read_csv(

"data.csv",

skipinitialspace=True,

encoding="utf-8",

encoding_errors="strict",

on_bad_lines="skip",

)

```

이 설정은 다음처럼 이해하면 됩니다.

  • `skipinitialspace=True`: 구분자 바로 뒤에 있는 공백을 무시합니다.
  • `encoding`: 파일 인코딩을 명시합니다.
  • `encoding_errors`: 디코딩 에러 처리 방식을 제어합니다.
  • `on_bad_lines`: 열 개수가 맞지 않는 행을 어떻게 처리할지 정합니다.

3) `on_bad_lines`는 보조 수단이다

`on_bad_lines`는 bad lines에만 적용되는 처리입니다. 즉, CSV 전체를 자동으로 복원하는 기능은 아닙니다. `skip`으로 넘기거나 callable로 변형하면, 그만큼 데이터가 빠지거나 바뀔 수 있습니다.

실무적으로 주의할 점

  • bad line이 많다면 파일 자체의 품질을 먼저 점검하세요.
  • 스킵은 편하지만, 누락된 행이 있는지 검증이 필요합니다.
  • callable을 쓰는 경우도 “수정”이 아니라 “부분 복구”로 보는 편이 안전합니다.

4) 공백은 읽기 전과 읽은 후 둘 다 확인

`skipinitialspace=True`는 구분자 뒤 공백을 무시하지만, 컬럼명이나 셀 값 안쪽의 공백까지 모두 정리해 주는 것은 아닙니다. 그래서 읽은 뒤에도 한 번 더 정리하는 흐름이 좋습니다.

예시 후처리

```python

컬럼명 공백 제거

df.columns = df.columns.str.strip()

문자열 값 공백 제거

for col in df.select_dtypes(include="object").columns:

df[col] = df[col].str.strip()

```

이 단계는 읽기 옵션만으로는 놓칠 수 있는 자잘한 공백 문제를 마무리하는 용도입니다.

5) 인코딩은 추정보다 명시가 안전하다

`pandas.read_csv()`는 `encoding`과 `encoding_errors`를 통해 디코딩 문제를 다룰 수 있습니다. CSV를 `open()`으로 읽을 때는 별도 encoding을 지정하지 않으면 시스템 기본 encoding으로 디코딩됩니다. 그래서 외부에서 받은 파일은 가능하면 인코딩을 명시하는 쪽이 안전합니다.

추천 흐름

1. 파일 출처를 확인한다.

2. 가능한 인코딩을 명시한다.

3. 디코딩 오류가 나면 파일 품질 문제인지 먼저 판단한다.

4. 무리한 우회보다 원본 확인을 우선한다.

6) 실무용 정리 순서

다음 순서로 처리하면 구조가 단순합니다.

1. `read_csv()`에서 `skipinitialspace`, `encoding`, `encoding_errors`, `on_bad_lines`를 설정한다.

2. 깨진 행이 있으면 스킵/변형 여부를 기록한다.

3. 읽은 뒤 컬럼명과 문자열 값의 공백을 정리한다.

4. 결측치, 타입, 행 수를 검증한다.

5. 누락 가능성이 있으면 원본과 비교한다.

7) 안전한 운영 문구

블로그나 사내 가이드에는 아래처럼 적는 것이 좋습니다.

> 이 방법은 CSV를 부분적으로 정리하는 데 유용하지만, 모든 손상을 자동으로 복구하지는 못합니다. bad line 처리나 인코딩 우회는 데이터 손실 또는 내용 변경을 만들 수 있으므로, 적용 후 반드시 검증하세요.

8) 바로 써먹는 요약

  • 공백 문제: `skipinitialspace=True` + 후처리 `strip()`
  • 인코딩 문제: `encoding`과 `encoding_errors`를 명시
  • 깨진 행: `on_bad_lines`로 제한적으로 처리
  • 마무리: 읽은 뒤 컬럼/값/결측치 검증

CSV 자동 정리는 “한 번에 끝내는 기술”이라기보다, **읽기 제어 + 후처리 + 검증**의 조합에 가깝습니다. 이 흐름을 잡아두면 현업에서 훨씬 덜 흔들립니다.