HOWTO · Python

Python에서 파일이 비어 있는지 확인

파일이 비어 있는지 확인하는 방법을 배웁니다. 또한 Python에서 빈 파일을 확인하는 동안 제기된 다양한 문제를 살펴봅니다.

이 페이지의 내용

0바이트 파일에는 바이트가 없습니다. 하지만 구조화된 데이터에서는 ‘비어 있음’이 다른 의미일 수 있습니다. CSV를 읽었을 때 행이 없을 수 있고, Excel 통합 문서에는 서식이나 시트 메타데이터가 있어도 시트에 레코드가 없을 수 있습니다. 필요한 정보에 맞는 검사를 선택하세요. 파일 크기 검사는 일반 파일에 바이트가 있는지 알려 주고, 표 검사는 읽어 들인 표에 행이 있는지 알려 줍니다.

파일 크기로 비어 있는지 확인하기

파일 시스템은 크기를 바이트 단위로 보고합니다. 일반 파일의 크기가 0이면 바이트가 없는 것입니다. 크기가 0이 아니라고 해서 텍스트 파일에 의미 있는 내용이 들어 있다고 단정할 수는 없습니다. 공백 문자, 바이트 순서 표시(BOM) 또는 애플리케이션에서 사용하지 않는 데이터만 들어 있을 수도 있습니다. ‘공백이 아닌 텍스트가 없음’을 확인하려면 파일을 읽고 디코딩한 내용을 검사하세요.

이 예제는 임시 폴더에 입력 파일을 직접 만들고 블록이 끝나면 삭제합니다. Python 표준 라이브러리만 사용하므로 별도의 데이터 파일을 준비하거나 특정 컴퓨터의 경로를 바꾸지 않고 스크립트에 붙여 넣어 사용할 수 있습니다. 검사는 불리언 값을 반환하므로 프로그램의 조건문에서 사용하거나 로깅 함수에 전달할 수 있습니다. 다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("Ready to process.\n", encoding="utf-8")
    print(path.is_file())
    print(path.stat().st_size == 0)

임시 디렉터리를 사용하므로 예제는 특정 컴퓨터의 폴더에 의존하지 않습니다. 첫 번째 검사는 경로가 일반 파일인지 확인하고, 두 번째 검사는 파일의 바이트 크기가 0인지 확인합니다.

pathlib로 파일 확인하기

파일 크기를 조회하기 전에 Path.is_file()을 사용하세요. 경로가 없거나 일반 파일이 아니면 False를 반환합니다. 실제 애플리케이션에서는 path를 입력으로 받은 경로로 바꾸세요. 백슬래시가 이스케이프 문자로 해석될 수 있는 Windows 경로에는 원시 문자열을 사용하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

path = Path("notes.txt")
if not path.is_file():
    print("The path is missing or is not a regular file.")
else:
    try:
        empty = path.stat().st_size == 0
    except OSError as error:
        print(f"Could not check the file: {error}")
    else:
        print(f"Empty: {empty}")

is_file() 확인이 끝난 뒤 파일이 사라지거나 접근할 수 없게 될 수도 있으므로 크기 조회를 try 안에서 수행합니다. stat()이 실패하면 예제는 파일을 빈 파일로 취급하는 대신 해당 파일 시스템 오류를 보고합니다. 한 번만 확인한다면 Path.stat().st_size == 0이 직접적인 크기 검사입니다. 경로 유사 객체를 받는 os.path.getsize(path) == 0도 같은 용도로 사용할 수 있습니다.

CSV 파일에 행이 있는지 확인하기

CSV는 파싱하는 텍스트이므로 파일의 바이트 수만으로 레코드 수를 판단하기 어렵습니다. 헤더는 있지만 데이터 행이 없는 파일에도 바이트가 있습니다. 반대로 빈 줄만 있는 CSV는 사용할 수 있는 표로 읽히지 않을 수도 있습니다. pandas에서 DataFrame.empty는 두 축 중 하나의 길이가 0이면 참이며, 모든 셀이 비어 있다는 뜻은 아닙니다. 이 방법을 사용하려면 pandas를 설치하세요.

다음 독립 실행형 예제는 파싱 전에 작은 CSV 파일을 만듭니다. 파싱할 열이 없으면 pandas.read_csv()가 pandas.errors.EmptyDataError를 발생시킬 수 있습니다. 이 경우를 파일 누락, 권한 문제, 잘못된 CSV와 구분해 처리하세요. 각각 적절한 대응이 다릅니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
from tempfile import TemporaryDirectory

try:
    import pandas as pd
except ImportError:
    print("Install pandas to run this example.")
else:
    with TemporaryDirectory() as folder:
        path = Path(folder) / "records.csv"
        path.write_text("name\nAda\n", encoding="utf-8")
        try:
            table = pd.read_csv(path)
        except pd.errors.EmptyDataError:
            print("The CSV has no parseable columns.")
        else:
            print(table.empty)

Excel 시트에 행이 있는지 확인하기

.xlsx 파일에는 셀 값뿐 아니라 통합 문서 구조도 들어 있으므로 바이트 크기만으로 특정 시트에 레코드가 있는지 알 수 없습니다. 시트를 읽은 뒤 결과 DataFrame을 확인하세요. read_excel()은 기본적으로 첫 번째 시트를 사용합니다. 데이터가 다른 시트에 있으면 sheet_name을 전달하세요. Excel을 읽으려면 pandas와 호환되는 Excel 엔진이 필요합니다. 많은 .xlsx 파일에는 openpyxl을 사용할 수 있습니다.

입력으로 받은 통합 문서에 맞게 경로와 시트 이름을 바꾸세요. DataFrame.empty는 행이나 열이 있는지 확인합니다. 셀이 비어 있는 행도 하나의 행으로 계산됩니다. 사용할 수 있는 행은 없지만 머리글이 있는 통합 문서라면 표에 열은 있고 행은 0개일 수 있습니다. 이 검사는 보통 이런 경우를 찾는 데 쓰입니다. 아래의 존재 확인은 이미 누락된 통합 문서에 대해 분명한 메시지를 표시합니다. read_excel()이 열기 전에 파일이 사라질 수도 있으므로, 읽기 과정에서는 FileNotFoundError를 별도로 처리합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

try:
    import pandas as pd
except ImportError:
    print("Install pandas and an Excel engine to read a workbook.")
else:
    workbook = Path("data.xlsx")
    if not workbook.is_file():
        print("Provide the path to an existing workbook.")
    else:
        try:
            table = pd.read_excel(workbook, sheet_name="Sheet1")
        except FileNotFoundError:
            print("The workbook disappeared before it could be read.")
        except PermissionError:
            print("Permission denied while reading the workbook.")
        except (ImportError, ValueError) as error:
            print(f"Could not read the selected sheet or Excel engine: {error}")
        else:
            print(table.empty)

파일 누락 및 읽기 오류 처리하기

모든 읽기 실패를 빈 파일로 표시하려고 포괄적인 except: 절을 사용하지 마세요. 경로 누락, 접근 거부, 잘못된 입력, 행이 없는 유효한 파일은 서로 다른 결과입니다. 일반 파일은 is_file()로 확인하고, 경로가 바뀔 수 있거나 프로세스에 접근 권한이 없을 수 있다면 stat() 주변에서 OSError를 처리하세요. pandas를 사용할 때는 파싱할 수 있는 열이 없는 CSV에 대해 EmptyDataError를 처리한 다음, 애플리케이션의 필요에 따라 FileNotFoundError, PermissionError, 파서 오류 또는 엔진 오류를 처리하세요. 개발 중에는 예상하지 못한 오류를 감추지 말고 확인할 수 있게 두세요.

핵심은 무엇을 측정하는지 구분하는 것입니다. 바이트를 확인하려면 파일 시스템을 사용하고, CSV나 Excel에서 표 또는 시트에 행이 있는지 알고 싶다면 데이터를 파싱하세요. 크기가 0이 아니거나 행의 모든 셀이 비어 있다고 해서 유용한 레코드가 있다고 단정할 수는 없습니다. 파일을 사용하는 애플리케이션에 맞춰 ‘사용 가능’의 기준을 정하세요.