변수의 값은 프로그램 실행이 끝나면 사라지지만 파일에 쓴 내용은 이름과 위치를 가진 기록으로 남습니다. open에 파일 이름과 모드를 전달해 파일과 프로그램 사이에 통로를 엽니다.
일상에서 보면변수는 작업 중인 메모지이고 파일은 다음 날에도 다시 꺼내 볼 수 있는 공책입니다.
with open('goal.txt', 'w', encoding='utf-8') as file:
file.write('Python 기초 완성')
실행 결과
goal.txt 파일에 Python 기초 완성이 저장됩니다.
한 줄씩 보기
goal.txt를 쓰기 모드로 엽니다.
한글을 안전하게 다루도록 UTF-8을 지정합니다.
문자열을 파일에 기록합니다.
직접 값 바꾸기저장할 문장을 자신의 학습 목표로 바꿔 보세요.
흔한 실수브라우저 실습의 파일은 실행 환경 안에 만들어지므로 내 컴퓨터의 다운로드 폴더에 자동 저장되지는 않습니다.
짧은 확인프로그램이 끝난 뒤에도 값을 남기려면 변수와 파일 중 무엇을 사용해야 할까요?
02
r, w, a 모드는 파일을 여는 목적
r은 읽기, w는 새로 쓰기, a는 기존 내용 뒤에 추가하기입니다. w는 같은 이름의 파일이 있으면 기존 내용을 지우므로 목적에 맞는 모드를 선택해야 합니다.
일상에서 보면공책을 읽기만 할지, 새 공책으로 덮어쓸지, 마지막 장에 이어 쓸지 정하는 선택입니다.
with open('log.txt', 'w', encoding='utf-8') as file:
file.write('첫 기록\n')
with open('log.txt', 'a', encoding='utf-8') as file:
file.write('둘째 기록')
실행 결과
log.txt에 첫 기록과 둘째 기록이 순서대로 남습니다.
한 줄씩 보기
w 모드로 첫 내용을 저장합니다.
줄바꿈 문자로 다음 기록의 위치를 만듭니다.
a 모드로 기존 내용 뒤에 추가합니다.
직접 값 바꾸기두 번째 open의 a를 w로 바꾸면 첫 기록이 어떻게 되는지 확인하세요.
흔한 실수기존 기록을 보존해야 할 때 w를 사용하면 이전 내용이 사라집니다.
짧은 확인기존 내용 뒤에 새 기록을 붙이는 모드는 무엇일까요?
03
with가 파일을 안전하게 닫는다
파일은 사용 후 닫아야 저장이 마무리되고 자원이 정리됩니다. with open을 사용하면 들여쓴 블록이 끝날 때 Python이 자동으로 파일을 닫아 주므로 close 호출을 잊지 않을 수 있습니다.
일상에서 보면자료실에서 문서를 사용한 뒤 반납 절차를 자동으로 처리해 주는 대출 창구와 같습니다.
with open('memo.txt', 'w', encoding='utf-8') as file:
file.write('안전하게 저장')
print(file.closed)
실행 결과
True
한 줄씩 보기
with 블록 안에서 파일을 사용합니다.
블록이 끝나며 파일이 자동으로 닫힙니다.
closed 속성으로 닫힘 상태를 확인합니다.
직접 값 바꾸기with 블록 밖에서 file.write를 호출하면 어떤 오류가 나는지 확인하세요.
흔한 실수with 블록 밖에서 닫힌 file 객체를 다시 읽거나 쓰면 ValueError가 발생합니다.
짧은 확인with open을 사용하면 close를 직접 호출해야 할까요?
04
읽은 줄은 문자열이므로 정리하고 변환한다
read는 전체 문자열, readline은 한 줄, readlines는 줄들의 리스트를 돌려줍니다. 줄 끝의 \n은 strip으로 제거하고, 숫자 계산 전에는 int나 float로 변환합니다.
일상에서 보면상자에서 꺼낸 라벨의 포장과 줄바꿈을 벗기고 필요한 숫자 형태로 바꾸는 과정입니다.
with open('scores.txt', 'w', encoding='utf-8') as file:
file.write('80\n90\n')
with open('scores.txt', 'r', encoding='utf-8') as file:
scores = [int(line.strip()) for line in file]
print(sum(scores))
실행 결과
170
한 줄씩 보기
점수를 한 줄에 하나씩 저장합니다.
파일을 줄 단위로 반복합니다.
strip으로 줄바꿈을 없애고 int로 바꿉니다.
숫자 리스트의 합계를 출력합니다.
직접 값 바꾸기세 번째 점수 70을 추가하고 합계를 확인하세요.
흔한 실수문자열 '80'과 '90'을 더하면 170이 아니라 '8090'이 됩니다.
짧은 확인파일에서 읽은 '80\n'을 정수 80으로 만들려면 어떤 두 단계가 필요할까요?
05
한 줄의 형식을 정하면 데이터를 다시 복원할 수 있다
과목과 시간처럼 여러 값을 저장할 때 쉼표 같은 구분자를 정합니다. 읽을 때 같은 구분자로 split하면 각 값을 다시 나눌 수 있습니다. 저장 형식과 읽기 규칙은 항상 함께 관리해야 합니다.
일상에서 보면주소를 시·구·동 순서로 적기로 약속하면 나중에도 같은 칸으로 정확히 나눌 수 있는 것과 같습니다.
line = '파이썬,45'
subject, minutes_text = line.split(',')
record = {'subject': subject, 'minutes': int(minutes_text)}
print(record)
실행 결과
{'subject': '파이썬', 'minutes': 45}
한 줄씩 보기
쉼표로 구분된 한 줄을 준비합니다.
두 부분을 두 변수로 나눕니다.
시간을 정수로 바꿔 딕셔너리에 저장합니다.
직접 값 바꾸기과목을 함수, 시간을 30으로 바꿔 보세요.
흔한 실수저장할 때와 읽을 때 서로 다른 구분자를 쓰면 값을 제대로 나눌 수 없습니다.
짧은 확인'파일,60'에서 과목과 시간을 나눌 때 사용할 문자열 메서드는 무엇일까요?
02-1 · 단계별 따라 하기
메모 저장하고 다시 읽기
저장할 제목과 내용을 입력받습니다.
with open으로 쓰기 블록을 만듭니다.
줄바꿈을 포함해 두 줄을 저장합니다.
읽기 블록에서 저장 결과를 확인합니다.
title = input()
content = input()
with open('study_note.txt', 'w', encoding='utf-8') as file:
file.write(title + '\n')
file.write(content)
with open('study_note.txt', 'r', encoding='utf-8') as file:
print(file.read())