파일에 문자열을 쓸 때는 open 함수로 파일을 열어 파일 객체를 얻은 뒤, write 메서드를 사용합니다. 작업이 끝나면 반드시 close로 파일을 닫아줘야 합니다.
# 파일에 문자열 쓰기
file = open("hello.txt", "w") # 'w': 쓰기 모드
file.write("Hello, Python!\n")
file.close() # 반드시 닫아줘야 함
open 함수의 주요 모드를 정리하면 다음과 같습니다.
| 모드 | 설명 |
|---|---|
'r' | 읽기 (기본값) |
'w' | 쓰기 (파일이 있으면 내용을 덮어씀) |
'a' | 추가 (파일 끝에 이어서 씀) |
'rb' / 'wb' | 바이너리 읽기 / 쓰기 |
파일을 읽을 때도 open으로 파일을 연 뒤, read 메서드로 내용을 가져옵니다.
# 파일 전체 읽기
file = open("hello.txt", "r")
content = file.read()
print(content) # Hello, Python!
file.close()
파일을 열고 닫는 것을 매번 수동으로 하면 close를 빼먹기 쉽습니다. with as 구문을 사용하면 블록이 끝날 때 자동으로 파일을 닫아줍니다. 실전에서 가장 권장되는 방식입니다.
# with as: 자동으로 파일 닫기
with open("hello.txt", "w") as file:
file.write("Hello, Python!\n")
# 블록을 벗어나면 자동으로 file.close() 호출
# 읽기도 동일
with open("hello.txt", "r") as file:
content = file.read()
print(content)
💡
with as를 사용하면 예외가 발생하더라도 파일이 안전하게 닫힙니다. 항상with as를 사용하는 습관을 들이는 것이 좋습니다.
# for 반복문으로 여러 줄 쓰기
with open("numbers.txt", "w") as file:
for i in range(1, 6):
file.write(f"{i}번째 줄입니다.\n")
writelines는 리스트에 들어 있는 문자열을 파일에 씁니다. 자동으로 줄바꿈을 추가하지 않으므로, 직접 \n을 포함해야 합니다.
# writelines: 리스트의 문자열을 파일에 쓰기
lines = ["첫 번째 줄\n", "두 번째 줄\n", "세 번째 줄\n"]
with open("output.txt", "w") as file:
file.writelines(lines)
readlines는 파일의 모든 줄을 한 줄씩 리스트의 형태로 가져옵니다.
# readlines: 모든 줄을 리스트로 반환
with open("output.txt", "r") as file:
lines = file.readlines()
print(lines) # ['첫 번째 줄\n', '두 번째 줄\n', '세 번째 줄\n']
한 줄씩 읽을 때는 while과 readline을 함께 사용합니다. readline은 더 이상 읽을 줄이 없으면 빈 문자열을 반환합니다.
# while + readline: 한 줄씩 읽기
with open("output.txt", "r") as file:
line = file.readline()
while line:
print(line, end="") # 이미 \n이 포함되어 있음
line = file.readline()
for문을 사용하면 파일 객체를 직접 순회할 수 있어 훨씬 간결합니다.
# for문으로 한 줄씩 읽기 (가장 간결한 방법)
with open("output.txt", "r") as file:
for line in file:
print(line, end="")
파일 읽기/쓰기 메서드를 정리하면 다음과 같습니다.
| 메서드 | 기능 |
|---|---|
write(문자열) | 문자열을 파일에 쓰기 |
writelines(리스트) | 리스트의 문자열을 한꺼번에 쓰기 |
read() | 파일 전체를 문자열로 읽기 |
readline() | 한 줄을 읽기 |
readlines() | 모든 줄을 리스트로 읽기 |
지금까지는 문자열을 파일에 저장했지만, 리스트, 딕셔너리, 클래스 인스턴스 같은 파이썬 객체를 그대로 파일에 저장하고 싶을 때가 있습니다. 이때 pickle 모듈을 사용합니다.
| 용어 | 동작 | 함수 |
|---|---|---|
| 피클링(pickling) | 객체 → 파일에 저장 | pickle.dump() |
| 언피클링(unpickling) | 파일 → 객체로 복원 | pickle.load() |
pickle.dump를 사용하며, 파일은 반드시 바이너리 쓰기 모드('wb')로 열어야 합니다.
import pickle
# 피클링: 객체를 파일에 저장
data = {"name": "홍길동", "scores": [90, 85, 92], "grade": "A"}
with open("data.pkl", "wb") as file:
pickle.dump(data, file)
pickle.load를 사용하며, 파일은 바이너리 읽기 모드('rb')로 열어야 합니다.
import pickle
# 언피클링: 파일에서 객체 복원
with open("data.pkl", "rb") as file:
loaded_data = pickle.load(file)
print(loaded_data)
# {'name': '홍길동', 'scores': [90, 85, 92], 'grade': 'A'}
⚠️
pickle은 바이너리 형식으로 저장하므로, 일반 텍스트 에디터로는 내용을 확인할 수 없습니다. 또한pickle파일의 모드를'w'/'r'로 열면 에러가 발생하니 반드시'wb'/'rb'를 사용하세요.