파이썬 CSV 파일의 빈 줄은 먼저 open()의 newline='' 누락으로 줄바꿈 변환이 겹친 것인지 확인해야 합니다. csv.writer는 파일을 newline=''으로 열고, 실제 빈 행과 줄바꿈 표시 문제를 raw 내용과 csv.reader 결과로 구분하는 것이 핵심입니다. 그다음에야 lineterminator와 인용 설정을 조정할지 판단할 수 있습니다.
먼저 확인할 것: 파일에 빈 레코드가 있는가
Excel 화면에서 행 사이가 비어 보인다고 곧바로 데이터에 빈 행이 있다고 단정하면 곤란합니다. CSV는 한 레코드 안에 줄바꿈이 들어갈 수 있고, 운영체제의 줄바꿈 변환이 쓰기 과정에서 다시 적용될 수도 있기 때문입니다.
저라면 저장 코드를 고치기 전에 다음 두 가지를 분리해 확인합니다.
- 파일을 텍스트나 바이트 수준에서 열어 줄 끝이 어떻게 기록됐는지 확인합니다.
csv.reader로 읽어 실제 레코드가 몇 개이고, 각 레코드의 필드가 어떻게 나뉘는지 확인합니다.
reader.line_num을 레코드 수로 오해해서도 안 됩니다. 인용된 필드 안에 줄바꿈이 있으면 하나의 CSV 레코드가 여러 물리적 줄을 차지할 수 있습니다.
기본 저장 코드는 newline=”으로 시작합니다
Python 공식 문서는 csv 모듈에 전달하는 파일 객체를 newline=''으로 열도록 안내합니다. 텍스트 입출력에서 줄바꿈을 자동 변환하는 동작과 CSV writer의 레코드 종료 처리가 겹치지 않게 하려는 설정입니다.
import csv
rows = [
["name", "note"],
["Kim", "첫 번째 줄\n두 번째 줄"],
]
with open("result.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(rows)
newline=''은 줄바꿈을 모두 없애는 옵션이 아닙니다. 원래 줄바꿈을 변환하지 않고 CSV 모듈이 레코드와 인용 필드의 줄바꿈을 처리하도록 파일 객체를 여는 방식입니다.
반대로 newline=None인 기본 동작은 입력 줄바꿈을 \n으로 바꾸고, 쓰기에서는 \n을 시스템 기본 줄 구분자로 바꿀 수 있습니다. Windows에서 writer가 만든 줄 종료와 텍스트 계층의 변환이 겹치면 빈 줄처럼 보이는 결과가 생길 수 있으므로, CSV writer에는 newline=''을 우선 적용합니다.
lineterminator는 언제 확인할까
csv.writer의 기본 lineterminator는 \r\n입니다. 파일을 읽는 쪽은 \r 또는 \n을 행 끝으로 인식하므로, 저장 파일의 줄 종료를 특정 형식으로 맞춰야 하는 연동 환경에서만 명시적으로 지정하는 편이 좋습니다.
with open("result.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, lineterminator="\n")
writer.writerows(rows)
이 설정은 파일의 줄 종료 형식을 정하는 선택이지, 데이터에 들어 있는 빈 레코드를 삭제하는 기능은 아닙니다. newline=''으로 열었는데도 다른 프로그램에서 표시가 다르면 raw 줄 종료와 해당 프로그램의 CSV 해석을 함께 확인해야 합니다.
줄바꿈이 포함된 필드는 인용 설정과 함께 봅니다
필드 안에 delimiter, quotechar 또는 줄바꿈이 들어가면 기본 QUOTE_MINIMAL은 필요한 필드를 인용합니다. 따라서 셀 안의 줄바꿈을 단순히 행 구분자로 보고 제거하면 원래 데이터 구조를 훼손할 수 있습니다.
quoting=csv.QUOTE_NONE을 사용하면 필요한 문자를 escapechar로 처리해야 하므로, 특별한 파일 규격이 있을 때만 선택합니다. 일반적인 CSV 저장에서는 먼저 기본 인용 동작을 유지하고, 수신 시스템의 규격이 확인된 뒤 조정하는 순서가 안전합니다.
실제 빈 행과 변환 문제를 구분하는 순서
다음 순서로 확인하면 원인을 섞지 않고 수정 범위를 줄일 수 있습니다.
- 저장 직전
rows에 빈 리스트나 빈 필드만 있는 레코드가 들어가는지 확인합니다. - 파일을 다시 읽어
csv.reader가 반환하는 레코드와 필드를 확인합니다. - 파일의 물리적 줄 끝을 확인해
\r\n,\n이 예상과 다르게 섞였는지 봅니다. open(..., newline="")을 적용한 뒤에도 연동 프로그램에서만 다르게 보이는지 비교합니다.- 줄 종료 규격이 요구될 때만
lineterminator를 명시합니다.
실제 빈 행이 데이터에 들어 있다면 newline=''만으로 없어지지 않습니다. 반대로 데이터 레코드는 정상인데 줄 종료가 겹쳐 보이는 경우라면, 빈 행을 삭제하는 후처리보다 파일을 여는 방식과 저장 옵션을 바로잡는 것이 먼저입니다.
정리
csv.writer의 빈 줄 문제는 newline='' 누락, 줄 종료 형식, 실제 빈 레코드, 필드 내부 줄바꿈을 나누어 확인해야 합니다. 기본 출발점은 open(..., "w", newline="")이고, lineterminator는 연동 규격이 필요할 때만 명시합니다. 파일을 다시 저장하기 전 raw 줄바꿈과 csv.reader 결과를 확인하면 데이터 삭제로 문제를 가리는 일을 피할 수 있습니다.
다음으로 이어서 확인할 질문은 CSV 한글 깨짐이 줄바꿈 문제와 어떻게 다른지, 인용 필드 안의 줄바꿈을 어떻게 보존할지입니다.