Python for AI, Embedded/Python: Core & Automation

파이썬(Python) 파일 읽고 쓰기 총정리: 필수 파일 모드부터 CSV 파일 입출력까지

임베디드 친구 2025. 7. 2. 21:36
반응형

지난 시간까지 우리는 파이썬의 꽃이라고 할 수 있는 객체지향 프로그래밍(OOP)과 클래스 설계법에 대해 깊이 있게 알아보았습니다. 클래스로 아무리 멋진 프로그램을 만들어도, 프로그램이 종료되는 순간 메모리에 있던 데이터들은 신기루처럼 전부 사라져 버립니다. 프로그램이 계산한 결과나 로그를 하드디스크에 영구적으로 보관하거나, 이미 저장된 텍스트 및 외부 설정 파일을 불러와 가공하려면 '파일 입출력(I/O)' 기술이 반드시 필요합니다. 파이썬은 복잡한 운영체제의 파일 시스템을 단 몇 줄의 직관적인 명령어로 제어할 수 있는 강력한 내장 내비게이터를 제공합니다. 오늘은 기본 텍스트 파일 읽고 쓰기부터 실무 데이터 교환의 핵심인 CSV 포맷 제어까지 파일 입출력의 기초 일체를 소프트웨어 공장에서 깔끔하게 짚어드리겠습니다.

Generated by Gemini AI.

📌 핵심 요약 3줄

  • 파일을 다룰 때는 자원 낭비와 데이터 손상을 막기 위해 반드시 문을 열고(open) 닫는(close) 과정을 거쳐야 하며, 이를 자동화해 주는 with 문을 쓰는 것이 실무 표준입니다.
  • 데이터 처리 목적에 따라 읽기(r), 쓰기(w), 추가(a) 모드를 구별해 사용해야 하며, 전체 읽기(read)와 줄 단위 읽기(readline)의 메모리 동작 특성을 이해해야 합니다.
  • 파이썬 내장 csv 모듈의 reader, writer, DictReader를 활용하면 복잡한 쉼표 분리형 데이터 구조를 딕셔너리와 리스트 형태로 가볍게 요리할 수 있습니다.

1. 한눈에 보는 파이썬 파일 모드 및 읽기 메서드

파일을 열 때 사용하는 목적별 모드 기호와 데이터를 읽어 들이는 핵심 메서드들의 차이점을 표로 깔끔하게 정리했습니다.

① 파일 열기(Open) 기본 모드 요약

모드 기호 모드 명칭 파일이 존재할 때 동작 파일이 존재하지 않을 때 동작 핵심 특징 및 용도
'r' 읽기 (Read) 파일을 정상적으로 엽니다. FileNotFoundError 에러 발생 오직 데이터를 읽을 때만 사용 (기본값)
'w' 쓰기 (Write) 기존 내용을 완전히 삭제(덮어쓰기) 새로운 빈 파일을 자동 생성합니다. 초기 파일 생성 및 초기화 용도
'a' 추가 (Append) 기존 내용 뒤에 이어서 작성합니다. 새로운 빈 파일을 자동 생성합니다. 로그 기록, 데이터 누적 적재 용도
'b' 바이너리 (Binary) 텍스트가 아닌 이진 데이터로 처리 모드 조합에 따라 다름 이미지, 오디오, 실행 파일 등을 제어할 때 조합 ('rb', 'wb')

② 파일 읽기(Read) 메서드 비교

메서드명 읽기 범위 및 방식 반환되는 데이터 타입 대용량 파일 처리 시 추천 여부
read() 파일의 전체 내용을 통째로 읽어옴 하나의 거대한 문자열(String) 비추천 (메모리 과부하 위험)
readline() 파일에서 딱 한 줄만 읽어옴 하나의 줄 단위 문자열 추천 (반복문과 조합하여 메모리 절약)
readlines() 파일의 모든 줄을 한 번에 읽어옴 각 줄이 요소로 담긴 리스트(List) 보통 (파일 크기가 적당할 때 유용)

2. 안전한 파일 입출력과 with 문의 마법

과거에는 파일을 열면 무조건 코드 마지막에 file.close()를 적어 수동으로 닫아주어야 했습니다. 하지만 중간에 에러가 나면 닫기 코드가 실행되지 않아 파일이 깨지는 치명적인 문제가 있었습니다. 파이썬은 이 문제를 with 블록 하나로 깔끔하게 해결합니다.

Python
 
# 1. 수동으로 열고 닫기 (과거 방식 - 비추천)
file = open('example.txt', 'w')
file.write("Hello, Python!")
file.close()  # 깜빡하고 안 적으면 메모리 누수 발생!

# 2. 콘텍스트 매니저 'with' 문 활용 (실무 표준 - 강력 추천)
with open('example.txt', 'w') as file:
    file.write("Hello, world!\n")
    file.write("This is Python file I/O example.\n")
# 이 블록을 벗어나는 순간 파이썬이 알아서 안전하게 파일을 닫아줍니다.

3. 파일 읽기 시나리오별 구현 패턴

텍스트를 읽을 때는 파일의 용량과 가공 목적에 맞게 읽기 함수를 골라 써야 코드가 가벼워집니다.

Python
 
# 방법 A: read()로 전체 내용 한 방에 가져오기
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

# 방법 B: readline()과 while 루프로 대용량 파일 한 줄씩 갉아먹기
with open('example.txt', 'r') as file:
    line = file.readline()
    while line:
        print(line.strip())  # strip()으로 텍스트 끝의 줄바꿈(\n)을 지워줍니다.
        line = file.readline()

# 방법 C: readlines()로 줄 단위 리스트 만들어 가공하기
with open('example.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

4. 실무의 핵심, CSV 데이터 포맷 마스터하기

쉼표로 구분된 데이터 시트인 CSV 파일은 내장 csv 모듈을 쓰면 엑셀 부럽지 않게 제어할 수 있습니다.

Python
 
import csv

# ① CSV 파일 쓰기 패턴
# newline=''는 운영체제(특히 윈도우)에 따라 줄바꿈이 두 번 들어가는 현상을 막아줍니다.
with open('example.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Name', 'Age', 'City'])  # 헤더 작성
    writer.writerow(['Alice', 30, 'New York'])
    writer.writerow(['Bob', 25, 'Los Angeles'])

# ② csv.reader()로 일반 행 순회하기
with open('example.csv', 'r') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(', '.join(row))  # 각 열의 데이터를 쉼표로 묶어 정렬 출력

# ③ 추천 패턴: csv.DictReader()로 딕셔너리 매핑하기
# 첫 번째 행을 자동으로 Key로 인식하므로 코드 가독성이 극대화됩니다.
with open('example.csv', 'r') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(f"이름: {row['Name']}, 나이: {row['Age']}, 거주지: {row['City']}")

5. 개발을 위한 팁

  • 텍스트 파일의 영원한 숙제, 인코딩(encoding='utf-8') 명시하기: 파일을 열 때 인코딩을 생략하면 파이썬은 실행 중인 운영체제의 기본 인코딩 설정을 따릅니다. 이 때문에 개발자 컴퓨터(Mac/Linux - UTF-8)에서 잘 돌아가던 코드가 서버나 다른 윈도우 환경(CP949)으로 넘어가면 한글이 처참하게 깨지며 UnicodeDecodeError를 뿜어냅니다. 한글이나 특수문자가 들어간 텍스트를 다룰 때는 무조건 open('file.txt', 'r', encoding='utf-8') 처럼 인코딩을 박아두는 것이 협업과 배포의 기본 매너입니다.
  • 대용량 텍스트 파일은 메서드 없이 파일 객체 자체를 루프 돌리세요: readlines()는 파일의 모든 내용을 리스트 형태로 메모리에 한 번에 올립니다. 파일 용량이 몇 기가바이트(GB) 이상인 대형 로그 파일이라면 메모리가 버티지 못하고 뻗어버립니다. 파이썬의 파일 객체는 그 자체로 한 줄씩 호출해 주는 이터레이터 속성을 가집니다. 따라서 메서드 없이 for line in file: 구문을 바로 사용하면, 배후에서 한 줄씩만 메모리에 올리며 처리하므로 용량이 아무리 커도 메모리를 완벽하게 방어해 낼 수 있습니다.

6. 흔히 하는 실수

  • 파일 존재 여부를 점검하지 않고 'r' 모드로 진입하는 실수: 없는 파일을 읽으려고 하면 프로그램이 그 자리에서 셧다운 됩니다. 이를 방지하기 위해 파일 열기 전 try-except 구문으로 방어벽을 세우거나, os.path.exists('file.txt')를 통해 파일 유무를 먼저 검사한 뒤 진입하는 구조를 구축해야 사용자에게 부드러운 예외 안내를 제공할 수 있습니다.
Python
 
# [안전한 파일 입출력 예외 처리 가이드 패턴]
try:
    with open('secret_report.txt', 'r', encoding='utf-8') as file:
        data = file.read()
except FileNotFoundError:
    print("[경고] 요청하신 파일이 경로에 존재하지 않습니다.")
except PermissionError:
    print("[보안] 해당 파일에 접근할 수 있는 권한이 부족합니다.")
  • 'w' 모드의 무자비한 덮어쓰기 특성을 망각하는 경우: 쓰기 모드('w')는 무서운 모드입니다. 지정한 경로에 동명의 파일이 이미 존재하더라도 경고 없이 기존 알맹이를 싹 지워버리고 영(0)바이트짜리 새 파일로 덮어버립니다. 기존 데이터의 뒷부분에 새로운 로그나 정보를 단순 추가하고 싶을 때는 무조건 쓰기 모드가 아닌 추가 모드('a')로 진입해야 소중한 데이터를 잃어버리는 대참사를 막을 수 있습니다.

💡 맺음말

이번 시간에는 파이썬의 핵심 인프라 문법인 텍스트 파일 입출력 메커니즘과 안정적인 비즈니스 코드를 위한 with 문 스킬, 그리고 CSV 데이터를 자유자재로 요리하는 법까지 알차게 공부해보았습니다. 데이터를 외부 스토리지에 기록하고 불러오는 법을 깨달았으니, 이제 여러분의 프로그램은 영구적인 생명력을 얻은 셈입니다.

파일 입출력 도중 인코딩 크래시가 났거나 CSV 딕셔너리 키 매핑 중 에러가 발생했다면 주저하지 말고 아래 댓글 창에 에러 로그를 남겨주세요. 깔끔하게 뚫어드리겠습니다. 감사합니다!

반응형