무엇을 하는 것인가
지금까지 만든 결과는 전부 화면에 출력하고 끝이었습니다. 파일로 쓰면 프로그램이 끝나도 남고, 다음에 다시 읽어 이어서 쓸 수 있습니다.
파일을 열 때는 with open(...) as f: 모양을 씁니다. with를 쓰면 블록이 끝날 때 파일이 자동으로 닫힙니다. 닫는 걸 잊어서 내용이 저장 안 되는 사고를 아예 없애 줍니다.
두 번째 인자가 무엇을 할지입니다. "r"은 읽기, "w"는 쓰기, "a"는 뒤에 이어 붙이기입니다. "w"는 기존 내용을 지우고 새로 씁니다. 이걸 모르고 쓰다 파일을 날리는 일이 흔하니 조심하세요.
한글이 든 파일은 encoding="utf-8"을 반드시 적으세요. 윈도우는 기본 인코딩이 UTF-8이 아니라서, 안 적으면 한글이 깨지거나 UnicodeDecodeError가 납니다.
예제 코드
아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.
# 파일 읽고 쓰기 — with 한 줄이면 닫는 걸 잊을 일이 없습니다
# 한글이 들어가면 encoding="utf-8" 을 반드시 적으세요.
명단 = ["김서연", "이준호", "박민지"]
# 쓰기 "w" — 주의: 여는 순간 기존 내용이 지워집니다
with open("명단.txt", "w", encoding="utf-8") as f:
for 이름 in 명단:
f.write(이름 + "\n") # 줄바꿈은 직접 붙여야 합니다
# 이어 붙이기 "a" — 기존 내용을 두고 뒤에 씁니다
with open("명단.txt", "a", encoding="utf-8") as f:
f.write("최유진\n")
# 읽기 "r" — 파일도 "여러 줄이 든 것" 이라 for 에 그대로 넣습니다
with open("명단.txt", "r", encoding="utf-8") as f:
for 줄 in f:
print(줄.strip()) # 줄 끝 줄바꿈을 떼어냅니다
# 통째로 한 번에 읽기
with open("명단.txt", "r", encoding="utf-8") as f:
전체 = f.read()
print("글자 수:", len(전체))
# 리스트로 받기
with open("명단.txt", "r", encoding="utf-8") as f:
줄들 = [줄.strip() for 줄 in f]
print(줄들)
# 없는 파일을 읽으면 오류가 납니다. 미리 막아 두는 방법.
try:
with open("없는파일.txt", "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("그런 파일이 없습니다.")
# 실전 — 점수를 계산해 결과를 파일로 남기기
점수 = {"김서연": 90, "이준호": 85, "박민지": 77}
with open("성적표.txt", "w", encoding="utf-8") as f:
f.write("이름\t점수\t학점\n")
for 이름, 값 in 점수.items():
학점 = "A" if 값 >= 90 else "B" if 값 >= 80 else "C"
f.write(이름 + "\t" + str(값) + "\t" + 학점 + "\n")
print("성적표.txt 를 만들었습니다.")
기억할 것
with open(파일, "r", encoding="utf-8") as f:— 블록이 끝나면 자동으로 닫힙니다."r"읽기 ·"w"새로 쓰기(기존 내용 삭제) ·"a"이어 붙이기.- 한글이 있으면
encoding="utf-8"을 꼭 적으세요. - 한 줄씩 읽으려면
for 줄 in f:— 파일도 for 에 그대로 넣을 수 있습니다. - 읽은 줄 끝에는 줄바꿈이 붙어 있습니다.
.strip()으로 떼어냅니다.
자주 묻는 것
FileNotFoundError 가 납니다
그 이름의 파일이 없다는 뜻입니다. 파일이 파이썬 파일과 같은 폴더에 있는지 확인하세요. 다른 곳에 있으면 전체 경로를 적어야 합니다. 읽기 모드는 없는 파일을 만들어 주지 않습니다.
한글이 깨지거나 UnicodeDecodeError 가 납니다
encoding="utf-8"을 안 적었을 때 그렇습니다. 그래도 안 되면 그 파일이 UTF-8이 아닐 수 있습니다. 윈도우 메모장으로 만든 옛 파일은 encoding="cp949"로 열리는 경우가 있습니다.
파일 내용이 사라졌습니다
"w"로 열면 여는 순간 기존 내용이 지워집니다. 뒤에 덧붙이려던 것이면 "a"를 써야 했습니다. 되돌릴 방법은 없으니 중요한 파일은 미리 복사해 두고 연습하세요.
엑셀 파일도 이렇게 읽나요
아닙니다. xlsx는 텍스트가 아니라 압축된 형식이라 open()으로는 못 읽습니다. openpyxl 같은 라이브러리를 씁니다. csv는 텍스트라 이 방법으로도 읽히지만 csv 모듈을 쓰는 편이 안전합니다.