2023. 3. 6. 11:33ㆍ독서
안녕하세요!
<코딩 자율학습 나도코딩의 파이썬 입문> 멘토를 담당하게 된 이안입니다.
오늘은 8장 '입출력'에 대해 이어서 학습할게요!
오늘 공부할 내용은 다음과 같습니다.
🧐 공부할 내용(p.238 ~ p.250)
- 파일 입출력
- 데이터를 파일로 저장하기: pickle 모듈
- 파일 한 번에 열고 닫기: with 문
1. 파일 입출력
파이썬을 이용하면 파일을 직접 읽고, 파일에 직접 데이터를 쓸 수 있어요.
score_file = open("score.txt", "w", encoding="utf8")
print("수학: 0", file=score_file)
print("영어: 50", file=score_file)
score_file.close()
첫 줄의 의미는
'score.txt 파일을 "쓰기" 모드로 열어서 "utf8"로 데이터를 쓴다.'라는 의미로 해석할 수 있어요.
print는 출력하는 것처럼 보이지만, file=score_file을 통해서 쓰는 위치를 지정한 것이죠.
그리고 파일을 다 쓴 후에는 반드시 close를 통해서 파일을 닫아야 합니다.
그렇지 않으면 에러가 날 수도 있고, 계속해서 파일과의 커넥션을 유지하기 때문에 자원이 낭비될 수 있어요.
파일을 쓰는 방법은 print() 말고도 write()를 이용해서 쓸 수 있어요.
score_file = open("score.txt", "w", encoding="utf8")
score_file.write("수학: 0\n")
score_file.write("영어: 50\n")
score_file.close()
이 코드는 첫 번째로 배운 코드와 완전히 동일한 코드입니다.
파일에 이어서 작성하고 싶다면 모드를 "a"로 변경해서 사용하시면 돼요.
score_file = open("score.txt", "a", encoding="utf8")
score_file.write("과학: 100\n")
score_file.write("국어: 70\n")
score_file.close()
파일 읽기: read(), readline(), readlines()
print()를 통해서 파일을 출력하면 모든 내용을 한 번에 출력하는 문제가 있습니다.
이때는 한 줄씩 출력하는 readline()을 사용하면 돼요.
score_file = open("score.txt", "r", encoding="utf8")
print(score_file.readline(), end="") #
print(score_file.readline(), end="") #
print(score_file.readline(), end="") #
print(score_file.readline(), end="") #
score_file.close()
이렇게 readline을 사용할 수 있고, 이를 간단하게 반복문으로 줄이면 242페이지의 코드가 됩니다.
이것 말고도 readlines()는 파일의 모든 내용을 불러와 list 형태로 저장한답니다.
🥕멘토 TIP
언뜻 보면 readlines가 더 매력적으로 다가올 수 있어요.
list에 저장하니까 뭔가 더 꺼내 쓰기 쉬울 것 같고요.
하지만 파일을 한 번에 다 불러오는 것은 상당히 부담이 되는 작업일 지도 몰라요.
10만 줄이라면? 100만 줄이라면?
그래서 파일을 읽을 때는 파일의 크기를 생각한 후 적절한 메서드를 사용하는 것이 중요합니다.
2. 데이터를 파일로 저장하기: pickle 모듈
파일은 텍스트 형태로 저장했었죠?
pickle은 이와는 다르게 객체 자체를(지금은 이해하기 어렵지만) 저장하는 방식입니다.
그렇기 때문에 속도가 더 빠르고, 코드 재사용성에서도 상당히 유용합니다.
예제코드를 같이 쳐볼까요?
import pickle
# 바이너리 형태로 profile.pickle 파일에 데이터를 씁니다.
profile_file = open("profile.pickle", "wb")
profile = {"이름":"스누피", "나이":30, "취미":["축구", "골프", "코딩"]}
print(profile)
# dump로 저장합니다.
pickle.dump(profile, profile_file)
profile_file.close()
# load로 바이너리 데이터를 읽어옵니다.
profile_file = open("profile.pickle", "rb")
profile = pickle.load(profile_file)
print(profile)
profile_file.close()
print(profile_file.readline()) 을 한 번 해보시면 이상한 문자가 출력되는 것을 알 수 있어요.
바이너리 즉, 2진 형태로 저장되어 있기 때문이죠.
그렇기 때문에 변환의 과정이 필요하고요.
그 변환의 과정은 load() 메서드가 해줍니다.
3. 파일 한 번에 열고 닫기: with 문
이전까지는 close() 메서드를 반드시 호출해서 파일을 수동으로 닫아줬어요.
하지만 with 문을 사용하면 수동으로 닫아주지 않아도 됩니다.
import pickle
with open("profile.pickle", "rb") as profile_file:
print(pickle.load(profile_file))
어때요? 쉽죠?
이렇게 하면 읽어 올 데이터가 없는 경우 자동으로 close()를 호출해 닫습니다.
만약 정말 그런지 확인하려면 이 방법을 사용하면 돼요.
import pickle
with open("profile.pickle", "rb") as profile_file:
print(pickle.load(profile_file))
print(profile_file._checkClosed())
위 코드를 출력하면 에러가 발생합니다
무슨 에러가 발생하나요?
ValueError: I/O operation on closed file.
이미 닫힌 파일에 대해서 명령을 수행하고 있다고 에러를 던집니다.
그러니 with~문을 사용하면 파일이 정상적으로 닫히는 것을 알 수 있죠.
이번 시간에는 8장을 끝냈어요.
파일 읽기와 쓰기는 데이터를 사용하는 일에서 아주 빈번하게 사용된답니다.
파일을 사용한 후에는 close문을 사용할 것, 그렇지 않다면 with문을 사용할 것.
2가지는 기억해 주세요!
궁금한 점이 있다면 댓글 남겨주세요!
✅ 정리
* 파일 입출력
* open, close, readline, readlines
* 데이터를 파일로 저장하기: pickle
* 이진 형태로 데이터를 저장
* 파일 한 번에 열고 닫기: with 문
'독서' 카테고리의 다른 글
(나도코딩의 파이썬 입문) 9장. 클래스(p.277~298) (0) | 2023.03.07 |
---|---|
(나도코딩의 파이썬 입문) 9장. 클래스(p.257 ~ p.276) (0) | 2023.03.06 |
(나도코딩의 파이썬 입문) 8장. 입출력(p.221 ~ p.237) (0) | 2023.03.05 |
(나도코딩의 파이썬 입문) 7장. 함수(p.202 ~ p.220) (0) | 2023.03.03 |
(나도코딩의 파이썬 입문) 7장. 함수(p.191 ~ p.201) (0) | 2023.02.28 |