파일 시스템 작업은 파이썬 프로그래밍의 기본적인 작업 중 하나입니다. 역사적으로 파이썬은 파일 작업을 위한 간단하고 직관적인 구문을 제공하여 자동화, 데이터 처리 및 웹 개발 작업에 인기 있는 언어가 되었습니다.
초기 파이썬 버전에서는 개발자들이 내장 함수 open()을 사용하여 파일 시스템에 접근했습니다. 파이썬 2.5가 출시되면서 컨텍스트 관리자 프로토콜이 추가되어 with 구문을 통해 자원을 안전하게 사용할 수 있게 되었으며, 이는 파일 작업 중 자원 누수와 오류 발생 가능성을 줄였습니다.
파일 작업에 대한 적절한 접근이 없으면 다음과 같은 문제가 발생할 수 있습니다:
현대의 파이썬에서의 적절한 파일 작업은 컨텍스트 관리자, 즉 with open() 구문을 사용합니다:
with open('data.txt', 'r', encoding='utf-8') as file: data = file.read()
이렇게 하면 오류가 발생하더라도 파일이 자동으로 닫힐 것을 보장합니다. 쓰기에는 'w' 모드를, 추가에는 'a', 이진 데이터 작업에는 'rb', 'wb' 등의 모드를 사용합니다. 큰 파일을 읽을 때는 반복(iteration)을 사용하는 것이 좋습니다:
with open('big_data.txt', 'r', encoding='utf-8') as file: for line in file: process(line)
주요 특징:
'r', 'w', 'a', 'b', '+').read()로 읽기보다는 줄 단위로 읽는 것이 최적입니다.파일을 열 때 컨텍스트 관리자를(with) 사용하는 이유는 무엇인가요? 단순히 file.close()를 호출하는 것으로 충분하지 않나요?
답변: 컨텍스트 관리자는 예외가 발생할 때도 파일을 보장된 방식으로 닫습니다. 수동으로 close()를 호출하는 것은 특히 복잡한 논리나 오류 블록에서 자주 잊혀지기 때문에 자원 누수로 이어질 수 있습니다.
코드 예시:
try: file = open('data.txt', 'r') data = file.read() finally: file.close()
이 접근 방식은 with open()을 사용하는 것보다 더 번거롭습니다.
**읽기 전용 모드 'r'로 열린 파일에 데이터를 기록할 수 있나요?**
답변: 아닙니다, 'r' 모드로 파일을 열면 데이터 기록이 불가능합니다. 기록 메소드를 호출하면 `io.UnsupportedOperation` 예외가 발생합니다. 기록을 하려면 'w', 'a' 또는 'r+' 모드를 사용해야 합니다.
**존재하지 않는 파일을 'r' 모드로 열면 어떤 일이 발생하나요?**
답변: `FileNotFoundError` 예외가 발생합니다. 새로운 파일을 생성하려면 'w' 모드를 사용하세요(파일이 없으면 생성됨), 또는 'a' 모드(추가)를 사용하거나 예외를 처리하세요.
# 일반적인 오류 및 안티 패턴
- 명시적인 닫기 없이 파일 열기 (`file = open(...); ...; file.close()`).
- 유니코드 데이터 작업 시 인코딩을 지정하지 않음.
- 전체 읽기(`read()`)를 사용하여 큰 파일에서 메모리를 낭비함.
# 실생활의 예
## 부정적인 사례
개발자가 여러 파일을 열고 컨텍스트 관리자를 사용하지 않아 한 파일을 닫는 것을 잊어버려 "Too many open files" 오류가 서버에서 발생하게 됩니다.
**장점:**
- 빠른 구현, 코드량이 적음.
**단점:**
- 파일 디스크립터 누수, 운영 중 애플리케이션 실패.
- 데이터 손실 가능성.
## 긍정적인 사례
각 파일에 대해 `with open()`을 사용하고, 인코딩을 명시적으로 지정하며, 큰 파일을 줄 단위로 처리합니다.
**장점:**
- 신뢰성, 자원의 자동 해제.
- 읽기 쉽고 안전하게 유지 관리됨.
**단점:**
- 초기에는 약간 더 많은 규율과 구문 지식 필요.