프로그램을 만들 때 메모리 상에서 처리되는 변수나 리스트의 데이터는 프로그램을 종료하는 순간 모두 사라져버립니다. 데이터를 다음번에 다시 쓰거나 보관하려면 컴퓨터의 디스크(하드드라이브)에 파일(File) 형태로 저장해야 합니다.

실무에서 가장 자주 다루는 데이터 형태가 바로 텍스트(txt)나 CSV 파일입니다. 하지만 비전공자가 파이썬으로 파일 입출력(File I/O)을 처음 다룰 때 십중팔구 마주치는 장벽이 있습니다. 파일이 이상한 외계어로 깨져서 읽히거나, 파일이 닫히지 않아 삭제가 안 되는 문제입니다. 오늘은 파이썬의 기본 파일 제어 방법과 with 구문, 그리고 한글 깨짐을 방지하는 인코딩 설정법을 깔끔하게 정리해 드립니다.

1. 파일 열기와 닫기의 기본 구조: open()과 close()

파이썬에서 파일을 다룰 때는 open() 함수로 파일을 열고, 필요한 작업을 마친 뒤 close() 함수로 파일을 닫아주는 것이 기본 원칙입니다.

Python
# 1. 파일 쓰기 모드로 열기
file = open("test.txt", "w")
file.write("파이썬 파일 입출력 첫걸음입니다.\n")
file.close()  # 작업 완료 후 반드시 닫아주어야 함

파일 열기 모드(Mode) 3가지

  • "w" (Write, 쓰기 모드): 파일에 내용을 새로 씁니다. 만약 기존에 동일한 이름의 파일이 존재하면 내용을 덮어씌워 전부 지워버리므로 주의해야 합니다.

  • "a" (Append, 추가 모드): 기존 파일 내용의 가장 뒤에 새로운 내용을 이어 붙입니다.

  • "r" (Read, 읽기 모드): 이미 존재하는 파일을 읽어옵니다. 파일이 존재하지 않으면 FileNotFoundError가 발생합니다.


2. 파일 닫기를 깜빡했을 때의 위험과 with 구문의 활용

open()을 사용한 뒤 file.close()를 작성하는 것은 파일 손상을 막기 위해 필수적입니다. 하지만 코드가 길어지거나 중간에 에러가 터지면 close() 호출을 빠뜨리기 쉽습니다. 파일이 계속 열려있으면 메모리가 낭비되거나 다른 프로그램에서 해당 파일을 수정/삭제할 수 없는 상태가 됩니다.

이 문제를 깔끔하게 해결해 주는 것이 바로 with 구문입니다.

Python
# with 구문을 활용한 안전한 파일 쓰기
with open("memo.txt", "w") as file:
    file.write("첫 번째 줄입니다.\n")
    file.write("두 번째 줄입니다.\n")

# with 블록을 벗어나는 순간 파이썬이 알아서 close()를 실행함

with 구문 내부의 코드 블록이 끝나면 에러 발생 여부와 상관없이 파이썬이 자동으로 파일을 안전하게 닫아줍니다. 따라서 실무에서는 open()과 close()를 따로 쓰지 않고 무조건 with open() 형태를 사용하는 것이 표준 표기법입니다.


3. 한글 깨짐 문제의 원인과 encoding="utf-8" 설정법

윈도우(Windows) 환경에서 파일 입출력을 하다가 가장 많이 겪는 현상이 바로 UnicodeDecodeError 에러나 한글이 ''처럼 깨지는 문제입니다.

이것은 윈도우의 기본 한글 인코딩 방식(CP949 또는 EUC-KR)과 현대 웹/소프트웨어의 표준 인코딩 방식인 UTF-8이 서로 충돌하기 때문입니다.

해결 방법: open() 함수에 인코딩 명시하기

파일을 열 때 encoding="utf-8" 옵션을 명시해주면 운영체제 종류와 상관없이 한글을 깨짐 없이 정확하게 읽고 쓸 수 있습니다.

Python
# 한글 저장하기
with open("hangul.txt", "w", encoding="utf-8") as f:
    f.write("안녕하세요. 한글 인코딩 테스트입니다.\n")

# 한글 읽어오기
with open("hangul.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)


4. 파일 읽기의 3가지 방법 (read, readline, readlines)

텍스트 파일의 용량이나 목적에 따라 파일 내용을 읽어오는 방식을 다르게 선택해야 합니다.

  1. read(): 파일 전체 내용을 통째로 하나의 큰 문자열로 읽어옵니다. 파일 용량이 아주 클 경우 메모리를 많이 차지할 수 있습니다.

  2. readline(): 파일의 내용을 한 줄씩 읽어옵니다. 반복문과 조합하여 용량이 큰 대용량 텍스트 파일을 처리할 때 유용합니다.

  3. readlines(): 파일의 모든 줄을 읽어서 각 줄을 요소로 갖는 리스트 형태로 반환합니다.

Python
# readlines()를 활용해 한 줄씩 처리하기
with open("hangul.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        print(line.strip())  # strip()으로 줄바꿈 문자(\n) 제거


핵심요약


  • 파일을 다룰 때는 파일 닫기 누락을 방지하기 위해 file.close() 대신 with open() 구문을 사용하는 것이 안전합니다.

  • 윈도우 환경 등에서 발생하는 한글 깨짐 현상을 예방하려면 open() 함수 내에 encoding="utf-8"을 명시해야 합니다.

  • 용량이 큰 파일의 경우 read()로 전체를 가져오기보다 readline()이나 readlines()를 활용해 한 줄씩 순차 처리하는 것이 효율적입니다.