학습 기록

Python 공부 기록 #13 - pandas로 정리한 데이터를 새 Excel 파일과 시트로 저장하기

0. 목차

  • 인트로: 화면에서 확인한 결과를 남겨두고 싶었다

    • 정리한 데이터를 새 Excel 파일로 저장하기

    • 행 번호 없이 깔끔하게 저장하기

    • 하나의 파일에 여러 시트 만들기

    • 원본 파일과 결과 파일 구분하기

    • 실무에서는 어디에 쓸 수 있을까?

    • 삽질했던 부분들

    • 아웃트로: 필터 결과를 다시 쓸 수 있는 파일로


1. 인트로: 화면에서 확인한 결과를 남겨두고 싶었다

지난 글에서는 pandas로 조건에 맞는 행을 골라내고, 제목이나 링크가 비어 있는 데이터도 확인해 봤습니다.

코드를 실행하니 터미널에는 원하는 결과가 잘 나왔습니다.

근데 창을 닫으면 결과도 같이 사라집니다. 회사에서 다른 사람에게 전달하려면 결국 Excel 파일이 필요할 것 같았고요.

“Python으로 정리한 결과를 다시 Excel로 저장할 수는 없을까?”

찾아보니까 pandas의 to_excel()을 사용하면 DataFrame을 새로운 Excel 파일로 저장할 수 있었습니다.

오늘은 지난 글에서 골라낸 데이터를 별도 파일로 저장하고, 하나의 파일 안에 여러 시트를 만드는 방법까지 공부해 봤습니다.


2. 정리한 데이터를 새 Excel 파일로 저장하기

먼저 크롤링 결과에서 카테고리가 코딩 공부인 행만 골라봤습니다.

import pandas as pd

df = pd.read_excel("blog_posts.xlsx")

coding_df = df[
    df["카테고리"] == "코딩 공부"
]

coding_df.to_excel("coding_posts.xlsx")

pd.read_excel()로 원본 파일을 불러온 뒤, 조건에 맞는 행만 coding_df에 담았습니다.

마지막의 to_excel()이 DataFrame을 Excel 파일로 저장하는 부분입니다.

코드를 실행하고 폴더를 확인하니 coding_posts.xlsx가 생겼습니다. Python에서 골라낸 결과가 실제 파일로 만들어지니 이거 되겠는데? 싶었습니다.


3. 행 번호 없이 깔끔하게 저장하기

생성된 Excel 파일을 열어 보니 맨 왼쪽에 원본에는 없던 숫자 열이 하나 생겼습니다.

이 숫자는 pandas가 각 행을 구분할 때 사용하는 index였습니다.

Excel 결과 파일에는 필요하지 않아서 index=False를 추가했습니다.

coding_df.to_excel(
    "coding_posts.xlsx",
    index=False
)

index=False는 pandas의 행 번호를 Excel에 저장하지 않겠다는 뜻입니다.

사용자에게 전달할 파일이라면 대부분 index=False를 넣는 편이 깔끔했습니다.

다시 저장해 보니 제목, 카테고리, 링크, 수집일처럼 원래 필요한 열만 남았습니다.


4. 하나의 파일에 여러 시트 만들기

이번에는 정상 데이터와 링크가 비어 있는 데이터를 한 파일에 나눠 담아봤습니다.

import pandas as pd

df = pd.read_excel("blog_posts.xlsx")

valid_df = df[df["링크"].notna()]
error_df = df[df["링크"].isna()]

with pd.ExcelWriter("blog_check_result.xlsx") as writer:
    valid_df.to_excel(
        writer,
        sheet_name="정상 데이터",
        index=False
    )

    error_df.to_excel(
        writer,
        sheet_name="링크 확인 필요",
        index=False
    )

pd.ExcelWriter()는 하나의 Excel 파일에 여러 시트를 저장할 때 사용합니다.

각각의 to_excel()에서 같은 writer를 사용하고, sheet_name으로 시트 이름을 정했습니다.

with 문이 끝나면 파일 저장도 함께 마무리됩니다. 처음에는 구조가 낯설었지만, 하나의 Excel 파일을 열어두고 여러 시트를 차례로 넣는다고 생각하니 이해하기 쉬웠습니다.


5. 원본 파일과 결과 파일 구분하기

처음에는 결과를 원본 파일과 같은 이름으로 저장하려고 했습니다.

근데 코드를 잘못 작성하면 크롤링 원본을 덮어쓸 수도 있겠더라고요.

그래서 입력 파일과 출력 파일의 이름을 따로 변수로 만들었습니다.

input_file = "blog_posts.xlsx"
output_file = "blog_check_result.xlsx"

df = pd.read_excel(input_file)

result_df = df[df["링크"].notna()]

result_df.to_excel(
    output_file,
    index=False
)

파일 이름을 변수로 분리하니 코드에서 원본과 결과를 구분하기 쉬웠습니다.

결과 파일 이름에 날짜를 붙이는 방법도 괜찮아 보였습니다.

output_file = "blog_check_result_20260730.xlsx"

매일 실행하는 코드라면 날짜별 결과를 남길 때 쓸 수 있겠습니다.


6. 실무에서는 어디에 쓸 수 있을까?

회사에서 받는 Excel 자료도 같은 방식으로 나눠 저장할 수 있을 것 같습니다.

  • 정상 데이터와 확인 필요 데이터를 시트별로 구분하기

    • 특정 영업 단계의 Opportunity만 새 파일로 저장하기

    • 필수 항목이 빠진 행을 점검용 시트에 모으기

    • 팀별 데이터를 각각 다른 시트로 나누기

    • 원본은 그대로 두고 보고용 결과 파일 만들기

Excel에서 필터한 결과를 복사해서 새 시트에 붙여 넣던 작업을 Python 코드로 바꿀 수 있는 셈입니다.

원본을 건드리지 않고 정리된 결과만 별도 파일로 남길 수 있다는 점이 가장 마음에 들었습니다.


7. 삽질했던 부분들

처음에는 아래와 같은 오류가 나면서 파일이 저장되지 않았습니다.

PermissionError: [Errno 13] Permission denied

원인은 이전에 만든 coding_posts.xlsx 파일을 Excel에서 열어둔 상태였기 때문이었습니다.

Windows에서는 Excel로 열어둔 파일을 Python이 다시 저장하지 못하는 경우가 있습니다.

파일을 닫고 코드를 다시 실행하니 정상적으로 저장됐습니다.

또 여러 시트를 만들 때 시트 이름을 31자보다 길게 작성하면 오류가 날 수 있다고 합니다. 시트 이름에는 일부 특수문자도 사용할 수 없었습니다.

저장 오류가 나면 먼저 결과 파일이 열려 있는지와 시트 이름을 확인하면 되겠습니다.


8. 아웃트로: 필터 결과를 다시 쓸 수 있는 파일로

오늘은 pandas로 정리한 데이터를 새로운 Excel 파일과 여러 시트로 저장해 봤습니다.

핵심 정리

  1. to_excel()로 DataFrame을 Excel 파일로 저장하기

  2. index=False로 불필요한 행 번호 제외하기

  3. sheet_name으로 시트 이름 정하기

  4. ExcelWriter로 하나의 파일에 여러 시트 만들기

  5. 원본과 결과 파일의 이름을 분리해서 덮어쓰기 막기

이제 할 수 있는 것들

  • 필터링한 결과를 새 Excel 파일로 저장하기

    • 정상 데이터와 확인 필요 데이터를 시트로 나누기

    • 원본 파일을 보존하면서 보고용 파일 만들기

    • 반복되는 Excel 복사와 붙여넣기 줄이기

다음 포스팅에서는 결과 파일 이름에 오늘 날짜를 자동으로 넣어보려고 합니다.

datetime을 사용해서 매일 다른 이름으로 저장하고, 기존 결과 파일이 덮어써지지 않도록 만드는 방법을 공부해 보겠습니다.