[Python] 파일 읽고 쓰기 - %%writefile, open(), read/write, 피클(pickle)
by 우와한개발자
0. 주피터 노트북으로 파일에 데이터 저장하기 : %%writefile
- 주피터 노트북에서 셀 첫 줄에 %%writefile 파일명을 쓰면 셀 내용을 파일로 저장할 수 있음
- 실습용 텍스트 파일을 빠르게 만들 때 유용
%%writefile sample.txt
안녕하세요
파일 입출력 실습입니다
홍길동
# 덮어쓰기 (기본)
%%writefile sample.txt
새로운 내용
# 추가 쓰기 — -a 옵션
%%writefile -a sample.txt
추가할 내용
# 실행하면 sample.txt 파일이 생성되고 이후 open()으로 읽을 수 있음
with open('member.txt','r',encoding='utf-8-sig') as f:
lines = f.readlines()
for line in lines:
data = line.strip().split(',')
name=data[0]
age=data[1]
email=data[2]
address=data[3]
print(f'이름:{name}, 나이:{age}, 이메일:{email}, 주소:{address}')
| 구분 | %%writefile | open() |
| 덮어쓰기 | %%writefile 파일명 | open('파일명', 'w') |
| 추가 쓰기 | %%writefile -a 파일명 | open('파일명', 'a') |
❓ utf-8-sig과 utf-8차이
- 윈도우 메모장에서 저장한 파일이나 엑셀에서 만든 CSV 파일에 BOM이 붙어있는 경우가 많아서, 그런 파일을 읽을 때 utf-8-sig를 씁니다. utf-8로 읽으면 첫 줄 앞에 \ufeff 같은 이상한 문자가 붙어서 나올 수 있음
utf-8 : 일반 utf-8 utf-8-sig : BOM(Byte Order Mark)이 포함된 utf-8
1. 파일 읽고 쓰기
1) open() : 파일 열기
- 파일에 데이터를 쓰거나 읽기 위해 파일 객체를 반환하는 함수
file_pointer = open(file_name, mode, encoding=’ASCII‘)
| 매개변수 | 설명 |
| file_name | 파일 경로 및 이름 |
| mode | 파일 열기 모드 |
| encoding | 인코딩 방식. 한글은 utf-8 권장 |
| mode | 설명 |
| r | 읽기 (기본값). 파일 없으면 오류 |
| w | 쓰기. 파일 없으면 생성, 있으면 덮어씀 |
| a | 추가 쓰기. 파일 없으면 생성, 있으면 끝에 추가 |
| x | 새 파일 쓰기. 파일 이미 있으면 오류 |
| b | 바이너리 모드 (rb, wb 형태로 조합) |
2) write() : 파일 쓰기
- 문자열을 파일에 씀
- print(내용, file=파일포인터) 방식도 가능
f = open('sample.txt', 'w', encoding='utf-8')
f.write('안녕하세요\\n')
f.write('파일 쓰기 예제입니다\\n')
# print 방식도 가능
print('홍길동', file=f)
f.close() # close() 해야 실제로 저장됨
3) read() : 파일 읽기
- 파일 전체 내용을 하나의 문자열로 반환
f = open('sample.txt', 'r', encoding='utf-8')
content = f.read() # 전체 읽기
print(content)
f.close()
| 메서드 | 설명 |
| read() | 전체 내용을 문자열로 반환 |
| readline() | 한 줄씩 읽기 |
| readlines() | 전체를 읽어 줄 단위 리스트로 반환 |
# readline — 한 줄씩
f = open('sample.txt', 'r', encoding='utf-8')
line = f.readline()
while line:
print(line, end='')
line = f.readline()
f.close()
# readlines — 리스트로
f = open('sample.txt', 'r', encoding='utf-8')
lines = f.readlines() # ['안녕하세요\\n', '파일 쓰기 예제입니다\\n']
for line in lines:
print(line, end='')
f.close()
4) close() : 파일 닫기
- write() 후 반드시 close() 해야 실제로 저장됨
- close() 하지 않으면 데이터 손실 가능
f = open('sample.txt', 'w', encoding='utf-8')
f.write('저장할 내용')
f.close() # 필수
5) with문 : 자동으로 close()
- with 블록을 벗어나면 자동으로 close() 호출
- close() 빠뜨리는 실수를 방지할 수 있어 권장하는 방식
# 쓰기
with open('sample.txt', 'w', encoding='utf-8') as f:
f.write('안녕하세요\\n')
f.write('with문 예제입니다\\n')
# 블록 벗어나면 자동으로 close()
# 읽기
with open('sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
2. 피클(Pickle)을 이용한 파일 읽고 쓰기
1) 피클(Pickle)이란?
- 파이썬 객체(리스트, 딕셔너리, 클래스 인스턴스 등)를 바이트 스트림으로 변환해 파일로 저장하는 모듈
- 일반 write()는 문자열만 저장 가능하지만, 피클은 파이썬 객체 그대로 저장 가능
- numpy, pandas 등 특정 라이브러리로 만든 객체도 피클로 저장하면 라이브러리 상관없이 피클로 읽을 수 있음
- 요즘은 데이터 분석 쪽에서는 pandas의 to_csv(), to_excel() 등을 더 많이 사용하는 추세
(1) pickle 주요 메서드
| 메서드 | 설명 |
| pickle.dump(obj, file, protocol=None) | 객체를 파일에 저장 (피클링) |
| pickle.load(file) | 파일에서 객체 복원 (언피클링) |
| pickle.dumps(obj, protocol=None) | 객체를 파일이 아닌 바이트 문자열로 반환 |
| pickle.loads(bytes) | 바이트 문자열을 객체로 복원 |
- protocol : 피클이 객체를 바이트로 변환할 때 어떤 방식으로 변환할지의 버전(None이면 파이썬이 현재 버전에 맞는 protocol을 자동으로 선택)
| protocol | 지원 파이썬 버전 |
| 0 | 초기 버전 |
| 1 | 초기 버전 |
| 2 | 파이썬 2.3+ |
| 3 | 파이썬 3.0+ |
| 4 | 파이썬 3.4+ |
| 5 | 파이썬 3.8+ |
# 0이나 False를 기본값으로 쓰면 의미가 달라질 수 있음
protocol=0 # protocol 0번을 쓰겠다는 의미가 됨
# None은 "아무것도 지정 안 함 → 자동"을 명확하게 표현
protocol=None # 자동 선택
- dump vs dumps 차이
import pickle
data = {'name': '홍길동', 'age': 30}
# dump — 파일에 저장
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# dumps — 파일 없이 바이트 문자열로 변환 (네트워크 전송 등에 활용)
byte_data = pickle.dumps(data)
print(byte_data) # b'\\x80\\x04\\x95...' ← 바이트 문자열
- load vs loads 차이
# load — 파일에서 읽기
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
# loads — 바이트 문자열에서 복원
data = pickle.loads(byte_data)
print(data) # {'name': '홍길동', 'age': 30}
2) 피클링(Pickling) : 쓰기(객채→바이트스트림)
- 파이썬 객체 계층 구조가 바이트 스트림으로 변환되는 것
- 파일 모드는 반드시 바이너리 쓰기 wb 사용
import pickle
data = {
'name': '홍길동',
'age': 30,
'scores': [90, 85, 92]
}
with open('data.pkl', 'wb') as f: # 바이너리 쓰기
pickle.dump(data, f) # 객체 → 바이트 스트림으로 저장
| 메서드 | 설명 |
| pickle.dump(obj, file, protocol=None) | 객체를 해당 파일에 저장 |
| pickle.dumps(obj, protocol=None) | 객체를 바이트 문자열로 반환 |
3) 언피클링(Unpickling) : 읽기(바이트스트림 → 객체)
| 메서드 | 설명 |
| pickle.load(file) | 파일에서 객체 복원 |
| pickle.loads(bytes) | 바이트 문자열을 객체로 복원 |
- 바이트 스트림을 다시 파이썬 객체로 복원하는 것
- 파일 모드는 반드시 바이너리 읽기 rb 사용
with open('data.pkl', 'rb') as f: # 바이너리 읽기
data = pickle.load(f) # 바이트 스트림 → 객체로 복원
print(data)
# {'name': '홍길동', 'age': 30, 'scores': [90, 85, 92]}
3. 일반 파일 vs 피클 비교
| 구분 | 일반 파일 (open) | 피클 (pickle) |
| 저장 형식 | 문자열 | 바이트 스트림 |
| 저장 가능 타입 | 문자열만 | 파이썬 객체 전부 |
| 사람이 읽을 수 있나 | ✅ | ❌ (바이너리) |
| 다른 언어에서 읽기 | 가능 | 불가 (파이썬 전용) |
| 파일 확장자 | .txt 등 | .pkl |
'언어 > Python' 카테고리의 다른 글
| [Python] JSON 파일 읽고 쓰기 - json.dump/load, HDF5, 파일 형식 비교 (0) | 2026.04.19 |
|---|---|
| [Python] CSV 파일 읽고 쓰기 - csv.reader, DictReader, DictWriter (0) | 2026.04.19 |
| [Python] 예외처리 - try/except, raise, 추상클래스, 사용자 정의 예외 (0) | 2026.04.19 |
| [Python] 클래스 상속 - super(), 메서드 재정의, name mangling(_클래스명__변수명) (0) | 2026.04.19 |
| [Python] 클래스 메서드, 정적 메서드, 생성자와 소멸자 - @classmethod, @staticmethod, __init__ (0) | 2026.04.19 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자