본문 바로가기
프로그래밍/Python

[Python]파이썬 에러 잡기와 파일 요리하기: 예외 처리 & 파일 입출력 완전 정복 🍳

by 다다면체 2025. 3. 31.
728x90
반응형

안녕하세요, 개발자 여러분! 오늘은 여러분의 파이썬 코드를 더욱 견고하고 유연하게 만들어 줄 핵심 개념, 예외 처리파일 입출력에 대해 쉽고 재미있게 알아보는 시간을 가져보려고 합니다. 마치 요리사가 예상치 못한 재료 손질 실수에도 당황하지 않고 맛있는 요리를 완성하듯, 우리도 예외 처리를 통해 프로그램이 오류로 멈추는 상황을 우아하게 넘길 수 있습니다. 또, 파일 입출력을 통해 외부 데이터와 소통하며 더욱 풍부한 기능을 구현할 수 있죠. 자, 그럼 함께 파이썬의 매력적인 세계로 빠져볼까요? ✨

반응형

🛠️ 예외 처리 (Exception Handling): 똑똑하게 에러에 대처하기

프로그래밍을 하다 보면 예상치 못한 상황, 즉 **예외(Exception)**가 발생하곤 합니다. 마치 우리가 일상생활에서 예상치 못한 문제에 직면하는 것과 같아요. 예를 들어, 0으로 숫자를 나누려고 하거나, 존재하지 않는 파일을 열려고 할 때 파이썬은 예외를 발생시키며 프로그램이 중단될 수 있습니다. 하지만 걱정 마세요! 파이썬은 이러한 예외 상황에 미리 대비하고 적절하게 처리할 수 있는 강력한 도구, 예외 처리 기능을 제공합니다.

🤔 예외 개념 및 발생 원인

예외는 프로그램 실행 중에 발생하는 오류를 의미합니다. 이러한 오류는 다양한 원인으로 발생할 수 있습니다.

  • 잘못된 연산: 0으로 나누는 경우 (ZeroDivisionError)
  • 존재하지 않는 변수 또는 함수 호출: 정의되지 않은 이름을 사용하는 경우 (NameError)
  • 잘못된 자료형 사용: 문자열을 정수로 변환하려고 시도하는 경우 (ValueError)
  • 존재하지 않는 파일 접근: 파일을 찾을 수 없는 경우 (FileNotFoundError)
  • 인덱스 오류: 리스트나 튜플의 범위를 벗어난 인덱스에 접근하는 경우 (IndexError)

이 외에도 수많은 예외 상황이 발생할 수 있으며, 예외 처리는 이러한 상황에 유연하게 대처할 수 있도록 도와줍니다.

🧱 try, except, else, finally 구문: 에러 방어막 만들기

파이썬에서는 try, except, else, finally 블록을 사용하여 예외를 처리합니다. 마치 요리할 때 안전 장비를 착용하는 것과 비슷하죠!

  • try 블록: 예외가 발생할 가능성이 있는 코드를 이 블록 안에 작성합니다. "혹시 문제가 생길 수도 있으니, 이 부분을 주의 깊게 봐줘!"라고 말하는 것과 같습니다.
  • except 블록: try 블록에서 특정 예외가 발생했을 때 실행할 코드를 작성합니다. "만약 이런 문제가 생기면, 이렇게 처리해!"라고 지시하는 것이죠. 여러 개의 except 블록을 사용하여 다양한 예외를 처리할 수 있습니다.
  • else 블록 (선택 사항): try 블록에서 예외가 발생하지 않았을 경우에 실행할 코드를 작성합니다. "아무 문제 없었으니, 이제 이 코드를 실행해!"라고 덧붙이는 것과 같습니다.
  • finally 블록 (선택 사항): 예외 발생 여부와 상관없이 항상 실행할 코드를 작성합니다. 주로 사용했던 자원을 정리하거나 마무리 작업을 할 때 유용합니다. "결과가 어떻든, 마지막으로 이 작업은 꼭 해줘!"라고 명령하는 것과 같습니다.

예시 코드:

try:
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    result = num1 / num2
    print("결과:", result)
except ValueError:
    print("⚠️ 오류: 유효한 숫자를 입력해주세요.")
except ZeroDivisionError:
    print("⚠️ 오류: 0으로 나눌 수 없습니다.")
except Exception as e:  # 모든 예외를 처리하는 방법 (권장하지 않음)
    print(f"🚨 예상치 못한 오류가 발생했습니다: {e}")
else:
    print("✨ 계산이 성공적으로 완료되었습니다.")
finally:
    print("✅ 예외 처리 완료!")

⚙️ 예외 처리 방법: 상황에 맞게 대처하기

예외를 처리하는 방법은 다양하며, 상황에 따라 적절한 방법을 선택해야 합니다.

  • 특정 예외 처리: 예상되는 특정 예외를 except 블록에서 명시적으로 처리합니다. 위 예시 코드처럼 ValueError나 ZeroDivisionError를 각각 처리하는 것이 좋은 방법입니다.
  • 다중 예외 처리: 하나의 except 블록에서 여러 종류의 예외를 튜플 형태로 묶어서 처리할 수 있습니다.
  • 모든 예외 처리 (주의): except: 또는 except Exception:과 같이 작성하여 모든 종류의 예외를 처리할 수 있지만, 어떤 오류가 발생했는지 정확히 파악하기 어려우므로 신중하게 사용해야 합니다.
  • 예외 정보 활용: except Exception as e:와 같이 as 키워드를 사용하여 발생한 예외 객체를 변수에 할당하고, 오류 메시지 등의 정보를 활용할 수 있습니다.

📝 사용자 정의 예외: 나만의 특별한 에러 만들기

때로는 파이썬에서 제공하는 기본 예외 외에 특정 상황에 맞는 사용자 정의 예외를 만들고 싶을 때가 있습니다. 이는 코드를 더욱 명확하게 만들고, 특정 오류 상황에 대한 맞춤형 처리를 가능하게 합니다. 사용자 정의 예외는 Exception 클래스를 상속받아 만들 수 있습니다.

예시 코드:

class 부족한잔액Error(Exception):
    def __init__(self, 잔액, 필요한금액):
        super().__init__(f"잔액이 부족합니다. 현재 잔액: {잔액}, 필요한 금액: {필요한금액}")

def 결제(잔액, 금액):
    if 잔액 < 금액:
        raise 부족한잔액Error(잔액, 금액)
    print(f"결제가 완료되었습니다. 남은 잔액: {잔액 - 금액}")

try:
    내잔액 = 10000
    구매금액 = 15000
    결제(내잔액, 구매금액)
except 부족한잔액Error as e:
    print(f"💸 오류: {e}")

📂파일 입출력 (File I/O): 데이터와 소통하기

프로그램은 종종 외부 파일에 데이터를 저장하거나, 파일에 저장된 데이터를 읽어와야 할 필요가 있습니다. 파이썬은 이러한 작업을 수행할 수 있도록 파일 입출력(File I/O) 기능을 제공합니다. 마치 우리가 책을 읽거나 일기를 쓰는 것과 비슷하죠!

🔓 파일 열기 (open()) 및 닫기 (close()): 파일과의 연결고리 만들기

파일을 사용하기 위해서는 먼저 파일을 열어야 합니다. 파이썬에서는 내장 함수인 open()을 사용하여 파일을 열 수 있습니다. open() 함수는 파일 객체를 반환하며, 이 객체를 통해 파일에 대한 다양한 작업을 수행할 수 있습니다. 파일을 다 사용한 후에는 반드시 close() 메서드를 호출하여 파일을 닫아주어야 합니다. 이는 마치 사용한 문을 잠그는 것과 같습니다.

open() 함수의 주요 인자:

  • file: 열고자 하는 파일의 경로 (문자열)
  • mode (선택 사항): 파일 열기 모드를 지정하는 문자열 (기본값은 'r' - 읽기 모드)
    • 'r': 읽기 모드 (파일이 존재해야 함)
    • 'w': 쓰기 모드 (파일이 없으면 새로 생성, 있으면 내용 덮어쓰기)
    • 'a': 추가 모드 (파일 끝에 내용 추가)
    • 'b': 바이너리 모드 (텍스트 파일이 아닌 이미지, 동영상 등의 파일을 다룰 때 사용)
    • 't': 텍스트 모드 (기본값)
    • '+': 읽기/쓰기 모드 (예: 'r+', 'w+', 'a+')

예시 코드:

file = open("my_file.txt", "w")  # 쓰기 모드로 파일 열기
file.write("안녕하세요! 파이썬 파일에 내용을 써봅니다.\n")
file.close()  # 파일 닫기

file = open("my_file.txt", "r")  # 읽기 모드로 파일 열기
content = file.read()
print(content)
file.close()

📖 파일 읽기 (read(), readline(), readlines()): 파일 내용 맛보기

파일을 읽는 방법에는 여러 가지가 있습니다.

  • read(): 파일 전체 내용을 하나의 문자열로 읽어옵니다. 마치 책 한 권을 통째로 읽는 것과 같습니다.
  • readline(): 파일에서 한 줄씩 읽어옵니다. 파일의 끝에 도달하면 빈 문자열을 반환합니다. 마치 책을 한 줄씩 읽는 것과 같습니다.
  • readlines(): 파일의 모든 줄을 읽어서 각 줄을 요소로 갖는 리스트를 반환합니다. 마치 책의 모든 줄을 한 번에 목록으로 받아보는 것과 같습니다.

예시 코드:

# read() 사용
with open("my_file.txt", "r") as file:
    content = file.read()
    print("--- read() ---")
    print(content)

# readline() 사용
with open("my_file.txt", "r") as file:
    print("--- readline() ---")
    line = file.readline()
    while line:
        print(line, end="")  # end=""를 사용하여 개행 문자 중복 방지
        line = file.readline()

# readlines() 사용
with open("my_file.txt", "r") as file:
    lines = file.readlines()
    print("--- readlines() ---")
    for line in lines:
        print(line, end="")

✍️ 파일 쓰기 (write(), writelines()): 파일에 정보 기록하기

파일에 데이터를 쓰는 방법도 여러 가지가 있습니다.

  • write(string): 파일에 문자열 데이터를 씁니다.
  • writelines(list_of_strings): 파일에 문자열 리스트의 각 요소를 순서대로 씁니다. 각 문자열 뒤에 개행 문자를 추가하려면 직접 추가해야 합니다.

예시 코드:

# write() 사용
with open("output.txt", "w") as file:
    file.write("파이썬으로 작성한 내용입니다.\n")
    file.write("두 번째 줄입니다.\n")

# writelines() 사용
lines_to_write = ["첫 번째 항목\n", "두 번째 항목\n", "세 번째 항목\n"]
with open("output.txt", "a") as file:  # 추가 모드로 열기
    file.writelines(lines_to_write)

✨ with 구문: 깔끔하게 파일 관리하기

파일을 열고 닫는 것은 매우 중요한 작업이지만, 때로는 실수로 close()를 호출하는 것을 잊을 수 있습니다. 파이썬의 with 구문은 이러한 문제를 깔끔하게 해결해 줍니다. with 블록을 사용하면 파일을 자동으로 열고 블록이 종료될 때 자동으로 닫아줍니다. 마치 자동으로 문이 닫히는 편리한 시스템과 같아요!

예시 코드:

with open("sample.txt", "r") as file:
    content = file.read()
    print("--- with 구문 사용 ---")
    print(content)
# with 블록이 끝나면 자동으로 파일이 닫힙니다.

🎉 마무리하며

오늘 우리는 파이썬의 강력한 기능인 예외 처리와 파일 입출력에 대해 자세히 알아보았습니다. 예외 처리를 통해 우리는 예상치 못한 오류 상황에 유연하게 대처할 수 있게 되었고, 파일 입출력을 통해 프로그램이 외부 데이터와 상호작용하며 더욱 다양한 기능을 수행할 수 있게 되었습니다. 이 두 가지 개념은 앞으로 여러분이 파이썬 프로그래밍을 하면서 마주하게 될 다양한 문제들을 해결하는 데 큰 도움이 될 것입니다. 꾸준히 연습하고 활용하여 파이썬 마스터가 되는 그날까지! 💪

728x90
반응형