랭귀지/python

안전하게 삭제하는 코드 예시

유키공 2025. 6. 26. 18:38
import os
import time
from openpyxl import load_workbook

temp_path = "temp.xlsx"

try:
    wb = load_workbook(temp_path)
    ws = wb.active
    # ... 작업 ...

finally:
    # 임시 파일 닫고 삭제 (삭제 실패 시 재시도)
    try:
        wb.close()
    except:
        pass

    max_retries = 5
    retry_delay = 0.5  # 초
    for attempt in range(1, max_retries + 1):
        try:
            os.remove(temp_path)
            print(f"✅ 임시 파일 삭제 완료: {temp_path}")
            break
        except PermissionError as e:
            print(f"⚠️ 삭제 실패 (시도 {attempt}/{max_retries}) - 파일이 열려 있거나 사용 중")
            time.sleep(retry_delay)
        except Exception as e:
            print(f"❗ 알 수 없는 오류: {e}")
            break
    else:
        print(f"❌ 최종 실패: 파일이 계속 사용 중입니다. 직접 닫은 후 수동 삭제하세요 → {temp_path}")

방법 1: wb.close() 후 삭제 (가장 확실함)

from openpyxl import load_workbook
import os
import time
import gc

temp_path = "temp.xlsx"

# temp.xlsx를 열어 처리
wb = load_workbook(temp_path)
ws = wb.active

# ... 원하는 작업 수행 ...

# 반드시 닫기
wb.close()
del wb
gc.collect()  # 가비지 컬렉션으로 완전 해제

# 잠시 대기 후 삭제 시도 (잠금 해제 지연 방지)
time.sleep(0.5)

# 삭제 시도
try:
    os.remove(temp_path)
    print("임시 파일 삭제 완료")
except PermissionError:
    print("❗ 파일이 열려 있거나 사용 중입니다. 수동으로 닫은 후 다시 시도하세요.")

 

 

 

import os
import time
import gc

file_path = "경로/파일.xlsx"

# 파일 작업 이후 객체 해제
try:
    wb.save(file_path)
    wb.close()  # 명시적으로 닫기
    del wb
    gc.collect()  # 가비지 컬렉션으로 파일 잠금 해제 유도
except Exception as e:
    print("파일 저장 오류:", e)

# 삭제 시도 (엑셀이 열려 있으면 실패)
try:
    os.remove(file_path)
    print("삭제 성공")
except PermissionError:
    print("⚠️ 파일이 열려 있어서 삭제할 수 없습니다. 엑셀 창을 닫고 다시 시도하세요.")