파이썬 pandas EmptyDataError 해결: 빈 CSV와 헤더 없는 파일 구분 순서

pandas.errors.EmptyDataError: No columns to parse from file가 나오면 파일 크기와 실제 내용을 먼저 확인하세요. 내용이 없는 파일인지, 빈 줄이나 설정된 주석만 있는지, 헤더 없이 데이터가 들어 있는지 구분한 다음 생성 단계의 완료 상태와 입력 계약을 확인합니다. 빈 결과가 허용된 작업이라면 기록을 남기고 처리할 수 있지만, 생성 실패나 누락이 의심되면 작업을 중단하고 원본 생성 단계부터 확인해야 합니다.

오류 메시지만으로 원인을 단정하지 마세요

pandas EmptyDataError 공식 문서는 read_csv()에서 빈 데이터나 헤더가 없어 읽을 열을 찾지 못할 때 이 예외가 발생할 수 있다고 설명합니다. 오류 메시지는 읽을 열이 없다는 단서이지 파일 생성이 성공했다는 증거가 아닙니다. 헤더가 없더라도 읽을 데이터 행이 있는 파일은 입력 형식에 맞게 읽어야 하며, 무조건 이 예외가 발생하는 것은 아닙니다.

다음 순서로 확인하면 입력 상태와 업무상 판단을 분리할 수 있습니다.

  • 파일과 크기: 실행 환경에서 실제로 지정한 경로의 파일을 확인합니다. pandas EmptyDataError 문서의 빈 입력과 달리 파일 자체가 없으면 경로와 생성 여부를 확인해야 합니다. 크기가 0바이트인 파일은 내용이 기록되지 않은 상태입니다.
  • 내용과 읽기 설정: 파일에 빈 줄이나 주석만 있는지, 열 이름과 데이터가 있는지 확인합니다. 개인정보나 민감한 값이 있다면 내용을 로그에 그대로 남기지 마세요.
  • 생성 상태와 계약: 앞 단계의 완료 상태, 예상 결과와 빈 결과 허용 여부를 확인합니다. 크기나 내용만으로 정상적인 무결과와 생성 실패를 구분할 수는 없습니다.
  • 처리 선택: 무결과가 허용되고 생성 성공을 확인했다면 건너뛰거나 합의된 빈 결과를 전달합니다. 실패·미완료·상태 불명이라면 원인을 확인할 때까지 중단하고, 필요하면 파일을 다시 생성합니다.

파일 상태별로 무엇을 확인하나

pandas read_csv 공식 문서에 따르면 skip_blank_lines의 기본값은 True입니다. comment로 지정한 문자로 시작하는 줄은 주석으로 처리될 수 있습니다. 따라서 파일 크기가 있어도 읽을 내용이 없을 수 있으며, 주석 처리는 해당 옵션을 지정했는지 함께 확인해야 합니다.

확인한 상태 판단과 다음 행동
0바이트 파일 내용이 없는 빈 파일입니다. 정상적인 무결과를 이런 형식으로 전달하기로 했고 생성 성공도 확인됐다면 계약에 따라 처리합니다. 그 외에는 생성·저장 단계를 확인합니다.
빈 줄이나 설정된 주석만 있음 읽을 열이 남는지 skip_blank_lines와 comment 설정을 확인합니다. 주석은 지정된 규칙에 따라 판단하고, 무결과 허용 여부는 생성 상태와 함께 확인합니다.
헤더만 있음 열 구조는 있지만 데이터 행은 없는 입력입니다. 헤더를 정상적으로 읽었다면 빈 행의 DataFrame을 유지할 수 있습니다. 행이 필수인 작업이라면 누락으로 처리합니다.
헤더 없이 데이터 행이 있음 생성 규격이 헤더 없는 CSV라면 header=None으로 첫 행을 데이터로 읽습니다. 파일이 비어 있다면 이 설정만으로 데이터를 복구할 수 없습니다.

예를 들어 아래 내용은 실제 운영 측정이 아닌 형식 예시입니다. 첫 줄이 열 이름이라는 계약이면 헤더만 있는 입력이고, 헤더 없는 입력이라는 계약이면 데이터 행입니다. 텍스트만 보고 어느 쪽인지 확정하지 말고 생성 규격을 확인하세요.

name,amount

header=None과 빈 DataFrame은 언제 사용하나

헤더 없는 CSV라는 사실을 확인한 경우에는 다음처럼 읽을 수 있습니다. pandas read_csv 문서는 header=None을 지정하면 첫 행을 열 이름으로 사용하지 않는다고 설명합니다.

import pandas as pd

df = pd.read_csv("records.csv", header=None)

이 코드는 형식 예시이며 파일 내용이나 실행 결과를 가정하지 않습니다. 헤더가 있는 파일에 무심코 적용하면 헤더도 데이터 행으로 취급될 수 있습니다. 열 이름이 필요한 후속 작업이라면 입력 계약에 맞는 이름과 순서를 정한 다음 검증하세요.

헤더만 있는 파일을 정상 무결과로 받아들이는 경우에는 읽어 들인 DataFrame의 열 구조를 유지하는 선택이 가능합니다. 반면 예외를 잡아 pd.DataFrame()으로 대체하면 원래 기대한 열 구조가 자동으로 보장되는 것은 아닙니다. 열이 필요한 작업이라면 합의된 열 이름을 명시하고, 그 구조를 후속 단계가 수용하는지 확인해야 합니다.

예를 들어 조회 결과가 없을 수 있는 작업에서 생성 단계가 성공했고 빈 결과가 허용된다는 기록이 있다면, 해당 파일을 건너뛰거나 정해진 열을 가진 빈 결과를 전달할 수 있습니다. 반대로 결과 행이 필수인데 파일이 비었거나 생성 상태를 확인할 수 없다면 빈 DataFrame으로 바꾸지 말고 실패로 표시해 생성 단계의 입력과 출력을 확인하세요. 파일을 다시 만들기 전에 원본과 생성 상태를 보존하면 누락 원인을 추적하는 데 도움이 됩니다.

다른 오류와 기록할 정보

파일이 없다는 오류는 경로와 생성 여부부터 확인합니다. 내용 파싱 중 오류를 나타내는 ParserError는 pandas ParserError 공식 문서에서 별도 예외로 설명합니다. 인코딩이 의심되면 실제 파일 인코딩과 read_csv의 encoding, encoding_errors 설정을 확인하세요. 오류 이름이 다르면 같은 빈 입력 처리로 묶지 않는 편이 원인 파악에 도움이 됩니다.

자동화에서는 입력 경로와 크기, 확인한 파일 상태, 생성 단계의 완료 상태, 빈 결과 허용 여부와 최종 처리 결과를 남겨 두세요. 파일 내용을 그대로 저장하기보다 진단에 필요한 상태를 기록하고, 재생성이 필요하면 그 판단도 남깁니다. 로그 구성은 파이썬 로그 콘솔·파일 레벨 분리에서 이어서 볼 수 있습니다.

결국 EmptyDataError 처리의 기준은 예외를 없애는 것보다 입력이 무엇이어야 했는지 확인하는 데 있습니다. 헤더 없는 유효 데이터에는 형식에 맞는 읽기 옵션을 적용하고, 빈 입력은 생성 성공과 업무 계약이 확인된 경우에만 합의된 방식으로 처리하세요.

Leave a Comment