Skip to main content

텍스트와 CSV 파일 처리

학습 목표

  • open()with 문으로 파일을 안전하게 읽고 쓸 수 있다
  • 다양한 파일 모드(r, w, a)를 구분하여 사용할 수 있다
  • csv 모듈로 CSV 파일을 읽고 쓸 수 있다
  • 인코딩 문제를 이해하고 해결할 수 있다

왜 중요한가

파일 I/O는 데이터 처리의 기본입니다. ML/DL에서 학습 데이터 로딩, 실험 결과 저장, 로그 기록 등 모든 작업이 파일 I/O 위에서 동작합니다.

텍스트 파일 읽기

1

기본 읽기

# with 문으로 안전하게 파일 열기
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()       # 전체 내용을 문자열로
print(content)

# 줄 단위 읽기
with open("data.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()    # 줄 단위 리스트

# 한 줄씩 순회 (메모리 효율적)
with open("data.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())  # 줄바꿈 제거
2

파일 쓰기

# 새 파일 작성 (기존 내용 덮어쓰기)
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("첫째 줄\n")
    f.write("둘째 줄\n")

# 여러 줄 한 번에 쓰기
lines = ["라인 1\n", "라인 2\n", "라인 3\n"]
with open("output.txt", "w", encoding="utf-8") as f:
    f.writelines(lines)

# 추가 모드 (기존 내용 유지)
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("새로운 로그 항목\n")
3

파일 모드 이해

모드설명파일 없을 때
r읽기 전용FileNotFoundError
w쓰기 (덮어쓰기)새로 생성
a추가 (이어쓰기)새로 생성
x배타적 생성새로 생성 (이미 있으면 에러)
r+읽기 + 쓰기FileNotFoundError

CSV 파일 처리

csv 모듈로 읽기

import csv

# 기본 읽기
with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)  # 헤더 행
    for row in reader:
        name, score, grade = row
        print(f"{name}: {score}점 ({grade})")

# DictReader - 딕셔너리로 읽기
with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['name']}: {row['score']}점")

csv 모듈로 쓰기

import csv

# 기본 쓰기
data = [
    ["이름", "점수", "등급"],
    ["김철수", 85, "B"],
    ["이영희", 92, "A"],
    ["박민수", 78, "C"],
]

with open("results.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

# DictWriter - 딕셔너리로 쓰기
records = [
    {"name": "김철수", "score": 85, "grade": "B"},
    {"name": "이영희", "score": 92, "grade": "A"},
]

with open("results.csv", "w", encoding="utf-8", newline="") as f:
    fieldnames = ["name", "score", "grade"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(records)
Windows에서는 open()newline=""을 반드시 추가하세요. 그렇지 않으면 빈 줄이 삽입됩니다.

인코딩

# UTF-8 (기본 권장)
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()

# EUC-KR (한국어 레거시)
with open("legacy.csv", "r", encoding="euc-kr") as f:
    content = f.read()

# 인코딩 자동 감지
import chardet

with open("unknown.txt", "rb") as f:
    raw = f.read()
    detected = chardet.detect(raw)
    encoding = detected["encoding"]
    print(f"감지된 인코딩: {encoding}")

content = raw.decode(encoding)

AI/ML에서의 활용

import csv

# 학습 로그 기록
def log_training(filepath, epoch, train_loss, val_loss, accuracy):
    """학습 결과를 CSV로 기록합니다."""
    file_exists = Path(filepath).exists()

    with open(filepath, "a", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(["epoch", "train_loss", "val_loss", "accuracy"])
        writer.writerow([epoch, f"{train_loss:.4f}", f"{val_loss:.4f}", f"{accuracy:.4f}"])

# 학습 루프에서 사용
for epoch in range(10):
    log_training("training_log.csv", epoch, 0.5/epoch, 0.6/epoch, 0.8+epoch*0.02)

# 대용량 텍스트 파일 스트리밍 처리
def process_large_file(filepath, batch_size=1000):
    """대용량 파일을 배치 단위로 처리합니다."""
    batch = []
    with open(filepath, "r", encoding="utf-8") as f:
        for line in f:
            batch.append(line.strip())
            if len(batch) >= batch_size:
                yield batch
                batch = []
        if batch:
            yield batch
파일을 수동으로 닫아야(f.close()) 합니다. 예외가 발생하면 닫히지 않아 데이터 손실이나 리소스 누수가 발생할 수 있습니다. 항상 with 문을 사용하세요.
Pandas의 read_csv()가 더 편리하지만, 간단한 CSV 처리에는 표준 csv 모듈로 충분합니다. Pandas는 데이터 분석 탭에서 다룹니다.

체크리스트

  • with open()으로 파일을 안전하게 열고 닫을 수 있다
  • 파일 모드(r, w, a)를 구분하여 사용할 수 있다
  • csv.reader/csv.writer로 CSV 파일을 처리할 수 있다
  • 인코딩 문제를 인지하고 encoding 매개변수를 설정할 수 있다

다음 문서