Python 파일 입출력: 파일 연산, 읽기, 쓰기, 관리 마스터하기
Python 파일 입출력
Python에서 파일을 열고, 읽고, 쓰고, 닫는 방법을 명확한 예제와 모범 사례로 배웁니다.
동영상: Python에서 파일 읽고 쓰기
파일
파일은 디스크에 데이터를 영구 저장하는 이름이 있는 위치입니다. RAM은 휘발성이라 프로그램 실행 간 정보 유지를 위해 파일에 의존합니다.
파일과 상호작용할 때 일반적인 순서는: 열기 → 읽기/쓰기 → 닫기.
Python에서 파일 열기
Python 내장 open() 함수는 I/O 연산에 사용할 파일 객체를 반환. 함수 시그니처:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
핵심 포인트:
mode가 연산 제어: r(읽기), w(쓰기, 기존 내용 잘림), a(추가), x(배타적 생성).
t(텍스트)가 기본; b(바이너리)는 bytes 객체 반환.
+로 동시 읽기/쓰기 가능.
- 텍스트 다룰 땐 플랫폼 의존 기본값(Windows
cp1252, Linux utf-8) 피하려 encoding 명시 필수.
| 모드 | 설명 |
r | 읽기(기본) |
w | 쓰기; 새로 만들거나 기존 잘라내기 |
x | 배타적 생성; 파일 존재 시 실패 |
a | 추가; 없으면 생성 |
t | 텍스트 모드(기본) |
b | 바이너리 모드 |
+ | 읽기 및 쓰기 |
f = open("test.txt") # r/rt
f = open("test.txt", "w") # 쓰기
f = open("img.bmp", "r+b") # 읽기/쓰기 바이너리
a는 문자이므로 인코딩 없인 숫자 97과 동등하지 않음. 텍스트 파일에 encoding='utf-8' 명시 권장.
f = open("test.txt", mode='r', encoding='utf-8')
Python에서 파일 닫기
파일을 제대로 닫아 시스템 자원 해제. close() 메서드가 단순하지만 컨텍스트 매니저가 가장 안전한 패턴.
with open("test.txt", encoding='utf-8') as f:
# 파일 연산 수행
pass
컨텍스트 매니저는 예외 발생 시에도 닫힘 보장. 수동으로 열면 try...finally 블록으로 감싸기.
try:
f = open("test.txt", encoding='utf-8')
# 연산
finally:
f.close()
파일에 쓰기
w, a, x 모드로 쓰기. w는 기존 내용 덮어쓰기, a는 보존.
write() 메서드는 문자열(바이너리면 bytes) 받아 쓴 문자 수 반환.
with open("test.txt", "w", encoding='utf-8') as f:
f.write("my first file\n")
f.write("This file\n\n")
f.write("contains three lines\n")
줄 구분을 위해 개행 문자 포함 필수.
파일 읽기
r 모드로 열기. read() 메서드는 선택적 size 인수 받음; 생략 시 EOF까지 읽음.
f = open("test.txt", "r", encoding='utf-8')
print(f.read(4)) # 'This'
print(f.read(4)) # ' is '
print(f.read()) # 나머지 내용
f.close()
seek()로 커서 이동, tell()로 현재 위치 조회:
print(f.tell()) # 현재 위치
f.seek(0) # 처음으로
print(f.read()) # 전체 읽기
줄 단위 효율적 순회:
for line in f:
print(line, end='')
대안으로 readline()과 readlines()가 줄별 접근 제공.
Python 파일 메서드
텍스트 모드에서 가장 흔한 파일 메서드 간단 참조:
| 메서드 | 설명 |
| close() | 파일 닫기 |
| detach() | 하위 바이너리 버퍼 분리 |
| fileno() | 파일 디스크립터 반환 |
| flush() | 쓰기 버퍼 플러시 |
| isatty() | 스트림이 대화형인지 확인 |
| read(n) | 최대 n 문자 읽기; None이면 EOF까지 |
| readable() | 스트림이 읽기 가능한가? |
| readline(n=-1) | 한 줄 읽기, 최대 n 문자 |
| readlines(n=-1) | 줄 리스트 반환, 최대 n 문자 |
| seek(offset, from_=SEEK_SET) | 커서를 from_(시작/현재/끝) 기준 offset으로 이동 |
| seekable() | 스트림이 임의 접근 지원하나? |
| tell() | 현재 커서 위치 얻기 |
| truncate(size=None) | 파일 크기를 size 바이트로 조정 |
| writable() | 스트림이 쓰기 가능한가? |
| write(s) | 문자열 s 쓰기; 쓴 문자 수 반환 |
| writelines(lines) | 문자열 이터러블 쓰기 |