본문 바로가기

개발공부/python

패스트캠퍼스 환급챌린지 8일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기

반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

 

Ch 8. 파일 입출력과 예외처리에 대해 알아볼까요?

 

 

파이썬 프로그래밍에서 파일 입출력은 데이터를 저장하고 불러오는 기본적이면서도 중요한 기능입니다. 웹 크롤링으로 수집한 데이터를 저장하거나, 설정 파일을 읽어오거나, 로그 파일을 작성하는 등 실제 프로그래밍에서 빈번하게 사용되는 핵심 기능이죠.

이 글에서는 파이썬의 파일 입출력을 기초부터 고급 기능까지 체계적으로 알아보겠습니다. 마치 책을 읽듯이 파일을 열고, 내용을 읽고, 수정하고, 닫는 과정을 차근차근 살펴보겠습니다.

1. 파일 입출력의 기본 개념

파일 입출력은 간단히 말해 컴퓨터의 저장 장치에 있는 파일과 우리 프로그램 사이에서 데이터를 주고받는 과정입니다. 이를 위해서는 먼저 파일을 "열어야" 하고, 작업이 끝나면 "닫아야" 합니다. 이는 책을 읽을 때 책을 펼치고, 다 읽으면 책을 닫는 것과 같은 개념입니다.

2. 기본적인 파일 열기와 닫기

2.1 파일 열기 - open() 함수

파이썬에서 파일을 열 때는 open() 함수를 사용합니다. 이 함수는 파일 경로와 모드를 인자로 받아 파일 객체를 반환합니다.

# 기본적인 파일 열기
file = open('sample.txt', 'r')  # 읽기 모드로 파일 열기
print(file.read())  # 파일 내용 출력
file.close()  # 파일 닫기 (중요!)

여기서 주목할 점은 파일을 연 후 반드시 close()를 호출해야 한다는 것입니다. 이는 시스템 리소스를 절약하고 데이터 손실을 방지하기 위해서입니다.

2.2 파일 모드의 이해

파일을 열 때 사용하는 모드는 파일을 어떤 목적으로 사용할지를 결정합니다.

# 다양한 파일 모드 예제

# 읽기 모드 (기본값)
file_read = open('data.txt', 'r')  # 또는 그냥 open('data.txt')

# 쓰기 모드 - 기존 내용을 덮어씀
file_write = open('output.txt', 'w')

# 추가 모드 - 기존 내용 끝에 새 내용 추가
file_append = open('log.txt', 'a')

# 읽기+쓰기 모드
file_readwrite = open('data.txt', 'r+')

# 바이너리 모드 (이미지, 동영상 등)
file_binary = open('image.jpg', 'rb')

각 모드의 특징을 정리하면 다음과 같습니다. 읽기 모드('r')는 파일을 읽기만 할 때, 쓰기 모드('w')는 새로운 내용을 쓸 때 사용하며 기존 내용을 모두 지웁니다. 추가 모드('a')는 기존 내용을 유지하면서 새로운 내용을 추가할 때 사용합니다.

3. 안전한 파일 처리 - with 구문

with 구문을 사용하면 파일을 자동으로 닫아주므로 더 안전하고 깔끔한 코드를 작성할 수 있습니다. 이는 파이썬의 컨텍스트 매니저라는 기능을 활용한 것입니다.

# with 구문을 사용한 안전한 파일 처리
with open('sample.txt', 'r') as file:
    content = file.read()
    print(content)
# 이 블록을 벗어나면 자동으로 파일이 닫힙니다

# 여러 파일을 동시에 처리
with open('input.txt', 'r') as input_file, \
     open('output.txt', 'w') as output_file:
    data = input_file.read()
    output_file.write(data.upper())  # 대문자로 변환하여 저장

with 구문을 사용하면 예외가 발생하더라도 파일이 자동으로 닫히므로 메모리 누수를 방지할 수 있습니다.

4. 파일 읽기의 다양한 방법

파일을 읽는 방법은 여러 가지가 있으며, 각각의 특징을 이해하고 상황에 맞게 선택하는 것이 중요합니다.

4.1 전체 내용 읽기

# 파일 전체를 한 번에 읽기
with open('novel.txt', 'r', encoding='utf-8') as file:
    entire_content = file.read()  # 파일 전체를 문자열로 읽기
    print(f"파일 크기: {len(entire_content)} 글자")
    print(entire_content[:100])  # 처음 100글자만 출력

4.2 한 줄씩 읽기

# 한 줄씩 읽기 - 메모리 효율적
with open('large_file.txt', 'r', encoding='utf-8') as file:
    line_number = 1
    while True:
        line = file.readline()  # 한 줄씩 읽기
        if not line:  # 더 이상 읽을 줄이 없으면
            break
        print(f"줄 {line_number}: {line.strip()}")  # strip()으로 개행문자 제거
        line_number += 1

4.3 모든 줄을 리스트로 읽기

# 모든 줄을 리스트로 읽기
with open('shopping_list.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()  # 모든 줄을 리스트로 읽기

    print(f"총 {len(lines)}개의 항목이 있습니다.")
    for i, item in enumerate(lines, 1):
        print(f"{i}. {item.strip()}")  # 각 줄의 개행문자 제거

4.4 반복자를 이용한 효율적인 읽기

# 파일 객체는 반복자이므로 for 루프로 직접 사용 가능
with open('data.txt', 'r', encoding='utf-8') as file:
    for line_num, line in enumerate(file, 1):
        # 빈 줄이 아닌 경우만 처리
        if line.strip():
            print(f"Line {line_num}: {line.strip()}")

5. 파일 쓰기의 다양한 방법

5.1 기본적인 파일 쓰기

# 새 파일에 내용 쓰기
with open('output.txt', 'w', encoding='utf-8') as file:
    file.write("안녕하세요, 파이썬!")  # 문자열 쓰기
    file.write("\n")  # 개행 문자 추가
    file.write("파일 입출력을 배우고 있습니다.")

5.2 여러 줄 쓰기

# 여러 줄을 한 번에 쓰기
lines = [
    "첫 번째 줄입니다.\n",
    "두 번째 줄입니다.\n",
    "세 번째 줄입니다.\n"
]

with open('multi_line.txt', 'w', encoding='utf-8') as file:
    file.writelines(lines)  # 리스트의 모든 요소를 파일에 쓰기

5.3 데이터를 파일에 저장하기

# 실제 데이터를 파일에 저장하는 예제
students = [
    {"name": "김철수", "age": 20, "grade": "A"},
    {"name": "이영희", "age": 19, "grade": "B"},
    {"name": "박민수", "age": 21, "grade": "A"}
]

with open('students.txt', 'w', encoding='utf-8') as file:
    file.write("학생 정보\n")
    file.write("=" * 30 + "\n")

    for student in students:
        # 각 학생의 정보를 한 줄로 저장
        file.write(f"이름: {student['name']}, 나이: {student['age']}, 학점: {student['grade']}\n")

6. 파일 추가 모드 활용

로그 파일이나 지속적으로 데이터를 추가해야 하는 경우에는 추가 모드('a')를 사용합니다.

import datetime

# 로그 파일에 새로운 항목 추가
def write_log(message):
    with open('app.log', 'a', encoding='utf-8') as file:
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        file.write(f"[{timestamp}] {message}\n")

# 로그 작성 예제
write_log("프로그램 시작")
write_log("사용자 로그인: admin")
write_log("데이터 처리 완료")
write_log("프로그램 종료")

7. 파일 입출력 시 주의사항과 예외 처리

파일 입출력에서는 다양한 예외가 발생할 수 있습니다. 파일이 존재하지 않거나, 권한이 없거나, 디스크 공간이 부족한 경우 등이 그 예입니다.

# 안전한 파일 읽기 예제
def safe_read_file(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read()
    except FileNotFoundError:
        print(f"파일 '{filename}'을 찾을 수 없습니다.")
        return None
    except PermissionError:
        print(f"파일 '{filename}'을 읽을 권한이 없습니다.")
        return None
    except Exception as e:
        print(f"파일 읽기 중 오류 발생: {e}")
        return None

# 사용 예제
content = safe_read_file('important_data.txt')
if content:
    print("파일 내용:", content[:50])  # 처음 50글자만 출력
else:
    print("파일을 읽을 수 없습니다.")

7.1 파일 존재 확인

import os

# 파일이 존재하는지 확인 후 처리
filename = 'config.txt'

if os.path.exists(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        config = file.read()
        print("설정 파일 로드 완료")
else:
    # 파일이 없으면 기본 설정으로 새 파일 생성
    default_config = """
# 기본 설정
port=8080
host=localhost
debug=True
"""
    with open(filename, 'w', encoding='utf-8') as file:
        file.write(default_config)
        print("기본 설정 파일이 생성되었습니다.")

 

오늘의 실습

 

https://fastcampus.info/4n8ztzq

 

(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스

초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!

fastcampus.co.kr

 

반응형