파일에 글자를 저장할 때는 with open(파일이름, 'w') as f: 블록을 열고 **f.write(문자열)**로 씁니다.
지금까지 만든 프로그램은 변수나 리스트에 값을 모아 두었기 때문에, 프로그램이 끝나면 모은 값도 함께 사라졌습니다. 실행이 끝난 뒤에도 결과가 남아 있게 하려면 컴퓨터의 파일에 글자를 적어 두어야 합니다. 파이썬의 with open(...)은 파일을 열어 글자를 쓰고, 블록을 빠져나올 때 파일을 저절로 안전하게 닫아 줍니다.
1새로 쓰기('w')와 with가 닫아 주는 규칙
open()에는 파일 이름과 열기 모드('w' 또는 'a')를 넘깁니다(윈도우에서 한글이 깨질 때는 encoding='utf-8'을 덧붙입니다).
with open('memo.txt', 'w') as f:
f.write('사과\n')
f.write('바나나\n')
with open('memo.txt', 'r') as f:
print(f.read(), end='')
사과
바나나위 코드는 memo.txt에 두 줄을 쓴 뒤, 잘 들어갔는지 다시 읽어 찍어 본 것입니다. 꼭 기억할 세 가지 규칙이 있습니다.
'w'모드(새로 쓰기): 파일이 없으면 새로 만들고, 이미 같은 이름의 파일이 있으면 안에 있던 내용을 모두 지우고 처음부터 새로 씁니다.\n직접 적기:f.write()는print()와 달리 줄바꿈을 자동으로 넣어 주지 않습니다. 줄을 나누려면 문자열 끝에\n을 직접 적어야 합니다.- 자동으로 닫기:
with안쪽의 들여쓰기가 끝나는 순간 파이썬이 파일을 자동으로 닫아 저장을 마무리합니다.
만약 \n을 적지 않고 f.write()를 두 번 부르면 파일 안에 어떻게 들어갈까요? 실행 결과를 먼저 맞혀 보세요.
with open('note.txt', 'w') as f:
f.write('첫째')
f.write('둘째')
with open('note.txt', 'r') as f:
print(f.read())
실행 결과 보기
첫째둘째예상과 다르면 그곳이 배울 곳입니다. f.write()는 넘겨받은 글자만 그대로 이어 적으므로, \n이 없으면 '첫째' 바로 뒤에 '둘째'가 한 줄로 붙어 '첫째둘째'가 됩니다.
2이어 쓰기('a')와 숫자를 글자로 바꿔 쓰기
기존 파일 내용을 지우지 않고 맨 끝에 줄을 덧붙이려면 'w' 대신 'a'(append) 모드를 씁니다.
with open('log.txt', 'w') as f:
f.write('1일차\n')
with open('log.txt', 'a') as f:
f.write('2일차\n')
with open('log.txt', 'r') as f:
print(f.read(), end='')
1일차
2일차두 번째 with open(...)에서 'a' 모드로 열었기 때문에 앞서 적어 둔 '1일차\n'이 지워지지 않고 그 아래에 '2일차\n'이 붙었습니다.
| 모드 | 파일이 없을 때 | 파일이 이미 있을 때 |
|---|---|---|
'w' (새로 쓰기) | 새로 만듦 | 기존 내용을 다 지우고 새로 씀 |
'a' (이어 쓰기) | 새로 만듦 | 기존 내용 맨 끝에 덧붙임 |
또한 f.write()는 문자열만 받습니다. 점수나 가격 같은 숫자를 파일에 적을 때는 str(n)으로 바꾸거나 f-문자열로 출력 꾸미기에서 배운 f-문자열을 써서 문자열로 만든 뒤 넘깁니다.
score = 95
with open('s.txt', 'w') as f:
f.write(f'점수: {score}\n')
with open('s.txt', 'r') as f:
print(f.read(), end='')
점수: 95예제
리스트의 항목들을 한 줄씩 파일에 저장하기
리스트에 담긴 장보기 목록을 for 반복문으로 돌며 파일에 한 줄씩 저장하는 코드입니다.
items = ['우유', '식빵', '달걀']
with open('cart.txt', 'w') as f:
for x in items:
f.write(x + '\n')
with open('cart.txt', 'r') as f:
print(f.read(), end='')
우유
식빵
달걀항목 x 뒤에 '\n'을 이어 붙여 썼기 때문에 파일 안에도 세 줄로 나뉘어 저장되었습니다.
자주 틀리는 곳
1. f.write()도 print()처럼 줄을 바꿔 줄 것이라 생각한다
틀린 생각: f.write('가')와 f.write('나')를 두 줄에 나누어 적었으니 파일에도 두 줄로 들어간다.
print()는 부를 때마다 줄바꿈을 자동으로 넣어 주어 그렇게 기대하기 쉽지만, f.write()는 내가 준 문자열에 들어 있는 글자만 그대로 파일에 적습니다.
with open('a.txt', 'w') as f:
f.write('가')
f.write('나')
with open('a.txt', 'r') as f:
print(f.read())
가나'\n'이 없어 '가나' 한 줄이 되었습니다.
맞는 규칙: 줄을 나누어 저장하려면 f.write('가\n')처럼 줄 끝에 '\n'을 직접 붙여 씁니다.
2. 이어 쓰려는데 반복문 안에서 'w'로 다시 연다
틀린 생각: 반복문 안에서 바퀴마다 with open(..., 'w')로 열어 쓰면 모든 바퀴의 내용이 쌓인다.
'w' 모드는 파일을 열 때마다 기존 내용을 싹 지우므로, 반복문 안에서 'w'로 열면 앞 바퀴에 쓴 줄이 매번 지워지고 마지막 바퀴의 한 줄만 남습니다.
for x in ['첫째', '둘째']:
with open('b', 'w') as f:
f.write(x + '\n')
with open('b', 'r') as f:
print(f.read(), end='')
둘째첫 바퀴에 쓴 '첫째\n'이 두 번째 바퀴의 'w' 열기에서 지워졌습니다.
맞는 규칙: 여러 줄을 한꺼번에 쓸 때는 with open(..., 'w') 블록 안에서 for 반복문을 돌리거나, 나중에 덧붙일 때는 'a' 모드를 씁니다.
3. f.write()에 정수를 그대로 넘긴다
틀린 생각: f.write(100)을 쓰면 파일에 '100'이 적힌다.
print(100)은 정수를 글자로 바꿔 찍어 주지만, 텍스트 파일의 f.write()는 오직 문자열(str)만 받습니다.
with open('c.txt', 'w') as f:
f.write(100)
Traceback (most recent call last): File "main.py", line 2, in <module> f.write(100) ~~~~~~~^^^^^TypeError: write() argument must be str, not intwrite()의 인자는 int가 아니라 str이어야 한다는 오류입니다.
맞는 규칙: 숫자를 파일에 쓸 때는 f.write(str(100) + '\n')이나 f.write(f'{n}\n')처럼 문자열로 바꾸어 넘깁니다.
확인 문제
1. 다음 코드를 실행하면 무엇이 출력될까요?
with open('t.txt', 'w') as f:
f.write('봄\n')
with open('t.txt', 'w') as f:
f.write('여름\n')
with open('t.txt', 'r') as f:
print(f.read(), end='')
힌트
두 번째 with open(...)의 열기 모드가 'a'가 아니라 'w'인 점에 주의하세요.
정답
여름두 번째 열기도 'w' 모드이므로 앞서 적힌 '봄\n'을 지우고 '여름\n'만 새로 씁니다.
2. 기존 파일 memo.txt의 내용을 지우지 않고 맨 끝에 '추가\n' 한 줄을 덧붙이도록 빈칸에 알맞은 모드 글자를 채우세요.
with open('memo.txt', ___) as f:
f.write('추가\n')
힌트
새로 쓰기는 'w', 끝에 이어 쓰기는 append의 첫 글자입니다.
정답
'a'입니다. 'w'를 쓰면 기존 내용이 모두 지워집니다.
3. 다음 코드는 리스트 [10, 20]의 숫자를 한 줄에 하나씩 파일에 쓰려 한 것인데 TypeError가 납니다. 3번 줄을 어떻게 고쳐야 할까요?
with open('n.txt', 'w') as f:
for n in [10, 20]:
f.write(n)
힌트
정수 n을 문자열로 바꾸고, 한 줄에 하나씩 들어가도록 끝에 '\n'도 붙여 주어야 합니다.
정답
3번 줄을 f.write(f'{n}\n') 또는 f.write(str(n) + '\n')으로 고칩니다.
아래 코드에서 두 번째 'w'를 'a'로 바꾸면 파일 내용이 어떻게 달라지는지 돌려 보세요.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.