13차시: 파일 입출력(File I/O) 마스터하기

파일 입출력은 프로그램의 데이터를 영구적으로 저장하거나(출력), 파일에 저장된 데이터를 프로그램으로 불러오는(입력) 필수적인 기능입니다. Python에서는 간단한 내장 함수를 통해 파일을 쉽게 다룰 수 있습니다. 기초부터 심화까지 다양한 예제를 통해 파일 처리 방법을 알아보겠습니다.

1. 기초 파이썬 예시 코드 (5개)

파일을 열고, 쓰고, 읽는 가장 기본적인 방법을 익힙니다.

1) 새 파일 생성 및 내용 쓰기 ('w' 모드)

# 'w' 모드는 파일이 없으면 새로 생성하고, 있으면 기존 내용을 덮어씁니다.

# with 구문은 파일 사용이 끝나면 자동으로 닫아줍니다.
with open('hello.txt', 'w', encoding='utf-8') as f:
    f.write("안녕하세요, 파일 입출력의 세계에 오신 것을 환영합니다.\n")
    f.write("이것은 두 번째 줄입니다.")

print("hello.txt 파일이 생성되고 내용이 작성되었습니다.")

2) 파일 내용 전체 읽기 ('r' 모드)

# 'r' 모드로 파일의 전체 내용을 하나의 문자열로 읽어옵니다.

try:
    with open('hello.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print("--- 파일 내용 ---")
        print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다. 먼저 파일을 생성해 주세요.")

3) 파일을 한 줄씩 읽기 (readlines)

# 파일의 각 줄을 요소로 하는 리스트를 반환합니다.

with open('hello.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    for index, line in enumerate(lines):
        print(f"{index + 1}번째 줄: {line.strip()}") # strip()으로 줄바꿈 제거

4) 기존 파일에 내용 추가하기 ('a' 모드)

# 'a' (append) 모드는 기존 내용을 보존하면서 맨 뒤에 내용을 덧붙입니다.

with open('hello.txt', 'a', encoding='utf-8') as f:
    f.write("\n새로운 줄이 추가되었습니다.")

print("내용 추가가 완료되었습니다.")

5) 반복문을 이용해 한 줄씩 읽기

# 메모리 효율을 위해 대용량 파일은 이 방식을 권장합니다.

with open('hello.txt', 'r', encoding='utf-8') as f:
    print("--- 반복문으로 읽기 ---")
    for line in f:
        print(line.end="") # 이미 줄바꿈이 포함되어 있으므로 end="" 처리

2. 응용 파이썬 예시 코드 (4개)

실무에서 활용 가능한 예외 처리 및 바이너리 파일 복사 기법을 다룹니다.

1) 사용자 입력을 파일로 저장하기

filename = 'user_data.txt'
print(f"'{filename}'에 저장할 내용을 입력하세요. '그만'을 입력하면 종료됩니다.")

with open(filename, 'w', encoding='utf-8') as f:
    while True:
        user_input = input("> ")
        if user_input == '그만':
            break
        f.write(user_input + "\n")

print(f"내용이 '{filename}'에 성공적으로 저장되었습니다.")

2) 파일 존재 여부 확인 후 처리

# os 모듈을 사용하여 안전하게 파일에 접근합니다.

import os

target_file = 'important_note.txt'

if os.path.exists(target_file):
    with open(target_file, 'r', encoding='utf-8') as f:
        print(f"파일 내용: {f.read()}")
else:
    print(f"'{target_file}' 파일이 존재하지 않습니다. 새로 생성합니다.")
    with open(target_file, 'w', encoding='utf-8') as f:
        f.write("이것은 중요한 메모입니다.")

3) 이미지 파일 복사 (바이너리 모드 'rb', 'wb')

# 텍스트가 아닌 파일은 'b'를 붙여 바이너리 모드로 처리해야 합니다.

# 준비물: 'source_image.jpg'라는 이미지 파일이 같은 경로에 있어야 합니다.
source_image = 'source_image.jpg'
dest_image = 'copied_image.jpg'

try:
    with open(source_image, 'rb') as f_in:
        with open(dest_image, 'wb') as f_out:
            # 파일 내용을 읽어서 그대로 씁니다.
            f_out.write(f_in.read())
    print(f"이미지 파일 복사 완료: '{dest_image}'")
except FileNotFoundError:
    print(f"'{source_image}' 파일을 찾을 수 없습니다.")

4) 특정 위치에서 읽고 쓰기 (seek, tell)

# seek()은 커서 이동, tell()은 현재 커서 위치를 반환합니다.

with open('seek_test.txt', 'w', encoding='utf-8') as f:
    f.write("0123456789abcdef")

with open('seek_test.txt', 'r+', encoding='utf-8') as f:
    f.seek(10) # 10번 인덱스 위치로 커서 이동
    data = f.read(4) # 4글자 읽기
    print(f"10번 위치에서 읽은 데이터: {data}") # 출력: abcd

    print(f"현재 커서 위치: {f.tell()}") # 출력: 14

    f.seek(0) # 파일의 맨 처음으로 이동
    f.write("Hello") # '01234' 부분이 'Hello'로 덮어씌워짐

3. 심화 파이썬 예시 코드 (1개)

1) 파일 내 특정 단어 치환하기

# 파일을 읽어 내용을 수정한 후 다시 저장하는 전형적인 텍스트 처리 로직입니다.

def replace_in_file(filename, old_word, new_word):
    """파일 내의 특정 단어를 찾아 새 단어로 바꿉니다."""
    try:
        # 1. 파일 읽기
        with open(filename, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 2. 내용 수정 (홍길동 -> 인수샘 등으로 변경)
        new_content = content.replace(old_word, new_word)
        
        # 3. 파일 다시 쓰기
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(new_content)
        print(f"'{old_word}'가 '{new_word}'로 변경되었습니다.")
        
    except FileNotFoundError:
        print("파일이 없습니다.")

# 예제 실행 (hello.txt 파일 내용 수정)
replace_in_file('hello.txt', '홍길동', '인수샘')