[이솦] 파이선으로 배우는 AI 기초 16
- 컴퓨터에서 프로그램 실행과 데이터 저장에 대한 주기억장치와 보조 기억장치의 역할을 설명한다.
- 파일 입출력 방법 및 파이썬을 사용한 텍스트 파일 생성, 읽기, 쓰기 방법 설명.
- with문을 사용하여 파이썬에서 파일을 자동으로 닫는 방법을 배운다.
우리가 프로그램을 만들면 그것은 주 기억 장치에서 실행된다. 컴퓨터에는 주기억장치와 보조 기억 장치가 있다. 프로그램에 사용되는 변수나 실행중에 발생하는 값들은 메모리 (주기억장치)에 저장된다. 필요한 결과 값을 남아 있게 하려면 보조 기억 장치에 파일로 기억하게 할수 있다.
인공지능 모델을 만드는건 쉬운것이 아니다. 제대로 동작하는 모델은 많은 데이터와 좋은 장비를 필요로 한다. 그래서 요즘은 인공지능 기업이나 연구 센터에서 미리 훈련된 모델을 파일로 배포한다. 기업에서 대용량 데이터와 고성능 컴퓨터로 미리 훈련을 시킨다. tensoeflow hub 현장의 개발자들이 이용하는 모델이다. (요즘은 hugging face 아닌가.. 시간이 흠...) 다양한 학습후에 저장된 모델들이다.
훈련할때 사용한 데이터 양과 훈련된 모델의 크기는 상관관계가 있을까? 상관관계는 없다. 데이터량이 많아지면, 훈련 시간은 증가하지만, 훈련 결과 모델의 크기는 차이가 없다.
요즘은 전문 개발자가 아닌 사람도 고성능의 인공 지능을 활용할수 있는 시대이다. 그러려면 저장된 모델 파일을 다루는 기술이 필요하다.
파일 입출력
오늘은 결과를 파일을로 저장하는걸 배울 것이다.
파일을 만들어 보자. 파일은 open()이라는 함수를 사용한다. 파일을 생성할때 파이선 내부에 사용되는 함수이다. 파일 이름과 파일 열기 모드만 지정해 주면 사용할수 있는 구조이다. 모드랑 파일을 어떤 상태로 사용할 것인지를 지정해 주는 것이다. 읽을 것인지, 쓸것인지, 추가할 것인지를 지정할수 있다. 지우는건 따로 없이 쓰기 모드가 지우는것과 같은 기능이다.
파일 생성하기
f = open("새파일.txt", 'w')
f.close()
f = open("./data/새파일.txt", 'w')
f.close()
W로 하면 열기 모드이다. 그 다음은 특정 폴더에 있는 파일을 열때 사용한다.
close() 파일을 닫아 주는 역활이다. 파일을 닫지 않으면 다른 프로그램에서 파일을 사용할수 없다.
파일 열기 모드는 3가지가 있다. 파일 객체=open(파일 이름, 파일 열기모드)
파일 열기 모드 | 설명 |
---|---|
r | 읽기모드- 파일을 읽기만 할때 사용 |
w | 쓰기모드-파일에 내용을 쓸때 사용 , 지우기도 가능 |
a | 추가모드-파일의 마지막에 새로운 내용을 추가 시킬때 사용 |
(아마 read, write, append의 약자인듯)
for i in range(1, 11):
data = "%d번째 줄입니다.₩n" %i
print (data)
이렇게 하면 1번째 줄입니다. 2번째 줄입니다. 의 값이 데이터에 들어가게 된다. 이 코드는 주 기억장치에 있는data라는 변수에 데이터가 저장된다. 이 데이터를 파일로 저장해 보자.
f = open("newfile.txt", 'w')
for i in range(1, 11):
data = "%d번째 줄입니다.\n" % i
f.write(data)
f.close()
f라는 변수를 주고 open 함수를 통해서 newfile을 쓰기 모드로 만든다. 반복은 1-10까지의 리스트를 만들어서 데이터를 만든다. f.write함수를 줘서 f라는 파일에 data를 저장하라고 시킨다. 그리고 마지막으로 파일을 닫는다. 그럼 저 파일에 내용이 저장되게 된다. 오류없이 실행됬다면 디렉토리에 파일이 있을 것이다.
저장된 파일은 텍스트 리더로 읽을수도 있지만 코드로 읽을 수도 있다.
f = open("newfile.txt", 'r')
while True:
lines = f.readline()
if not lines:
break
print(lines)
f.close()
파일을 읽으려면 open을 이용해서 읽기 모드로하며 모든 줄을 읽어서 화면에 출력하려면 반복문을 이용해보자.
while에서 true라고 했으니 계속 반복이 된다. 중요한 함수는 readline()인데 file 에서 한줄을 읽어서 반환한다. 그런데 전체가 아니라 한줄만 읽으니 전체를 읽으려면 반복을 시켜줘야 한다. if not line은 더 이상 읽을 라인이 없다는 뜻이다. 그러면 중지하고 전체를 프린트한다. 반복문을 쓰지 않고 lines=f.readline()만 있으면 한줄만 출력하니 조심하자
f = open("newfile.txt", 'r')
lines = f.readlines()
for line in lines:
print(line)
f.close()
반복문을 사용하지 않고 많은 라인을 볼수 있는 방법도 있다. 이번엔 readlines()라는 함수를 사용했다. 이 함수는 파일의 모든 줄을 ㅇ릭어서 각각의 줄을 요소를 갖는 리스트로 변환한다. 그래서 lines=f.readlines()를 실행하면 lines라는 리스트가 생성된다.
파일을 한줄씩 읽는게 불편하다면 파일 전체를 읽어 올수 있는 read()를 사용할수 있다. 그래서 f.read()로 하면 파일 전체를 데이터라는 변수에 넣어 준다.
with open("saying.txt", "w") as f:
f.write("인생은 짧고 예술은 길다")
f = open("saying.txt", 'r')
data = f.read()
print(data)
f.close()
파일을 열면 close해줘야 한다. 닫지 않으면 문제가 생긴다. 이것을 자동으로 처리하면 편하지 않을까? 파이썬의 명령문준에서는 with문이 바로 이런 역활을 해준다. open 함수로 saying.txt를 열고 f라는 객체로 만든다. with문은 close를 넣지 않아도 with문이 종료 되면 파일을 닫아준다. with문을 쓰지 않으려면 아래처럼 하면 된다. with문을 쓰지 않았기 때문에 close로 닫아 줘야 한다.
실습
오늘은 with문을 활용해서 txt파일로 만들어 보자.
with open("stockdiary.txt", 'w') as f:
f.write('2022년 1월 1일 오성전자 10만원 투자') # Indent this line
with open("stockdiary.txt", 'r') as f:
data = f.read() # Indent this line
print(data) # Indent this line
요약
지워지면 안되는 기록은 파일에 젖아
파일은 객체이고, write, read함수를 이용해서 쓰고 읽음
파일을 읽고 쓴 다음 close()함수를 이용해 파일을 닫아 줘야 한다.
파일을 쓰고 읽기 위해서 with문을 사용하면 닫아 주는 작업을 자동으로 처리해 준다.
사실 파일을 읽고 쓰는건 시스템 의존적이다. 사용하는 운영체계에 따라서 사용하는 기호가 다르다. 클라우드에서는 더 복잡할수도 있지만 가장 기본적인 파일 입출력은 잊지 말자.