우와한 개발자

[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

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기