9-1 문자열 읽고 쓰기
- 파일 처리
표준 입출력장치 ( input, pprint )로 자료를 처리하면 자료의 수가 한정되고, 자료를 저장하는 것이 불가능
따라서 보조기억장치 ( 하드디스크, usb 등)에 입/출력 해함
파일 열 때 : open() 함수
파일 닫을 때 : close() 함수
- 파일 객체 읽기
open("file", "mode")
f= open("file1.txt", "r")
모드
r : 읽기모드
w : 쓰기모드
a : 내용추가모드
t : 텍스트모드
b : 바이너리모드 (문자가 아닌 데이터를 읽고 쓸 때 사용, 음악, 이미지 파일 등)
- 파일 쓰기
파일객체.write()
print(문자열, file=파일객체) # print할때 file=파일객체로 파일을 연결해줌
f=open("file1.txt","w")
f.write("hello python \n") # \n로 새로운 줄 입력
print("파이썬의 세계",file=f)
f.close() # close를 꼭 해줘야 파일이 닫힘
예제1) 사용자의 입력을 data.txt파일에 저장하는 프로그램
사용자 입력이 종료될 때까지 계속 입력
프로그램을 다시 실행하더라도 기존의 파일 내용을 그대로 유지
a=input("저장할 내용 입력")
f= open("data.txt","a") # 내용 추가할때 "a" 사용, 위에 변수 a랑은 별개
while(a!="종료")
f.write(a+"\n")
a=input("저장할 내용 입력")
f.close() # close를 안해도 오류는 업지만, 파일이 계속 열려있게 됨
예제2) 학생의 학번, 이름과 주소를 class.txt.파일에 저장하는 프로그램
c_disc=dict()
for i in range(5):
a=int(input("학번"))
b=input("이름")
c=input("주소")
c_disc[a]=[b,c] # 딕셔너리,사전에 key 값은 a, value 값을 리스트로 [b,c]를 저장
f=open(("class.txt"),"w") # "w" 없으면 새로운 파일, 있으면 덮어씀
for k in c_disc.keys():
va=c_disc[k] # va에 value값 들을 저장
print(k,"의 이름은",va[0],"이고, 주소는",va[1],"입니다.",file=f) #file open하고 print 할때 항상 어디 파일과 연결되어 있는지 쓰기
f.close
예제3) 서점에서 책을 주문한 후 주문 리스트 저장
print("주문내역을 저장하는 프로그램")
fb=open("booklist.txt","w")
while True :
title=input("책 제목")
if(title=="Q"):
break
else:
cnt=int(input("권수"))
price=int(input("가격"))
totla=cnt*price
print("%s-%d-%d-%d" %(title,cnt,price,total),file=fb) # 항상 파일 연결
print("입력 모두 완료")
fb.close()
- 파일 읽기
파일 내용을 읽는 함수
read() : 파일의 모든 내용을 한번에 읽어서 한 개의 문자열 데이터로 반환
readline() : 호출할 때마다 한 줄씩 읽는 문자열을 반환
readlines() : 파일의 모든 내용을 줄 단위로 잘라서 리스트를 반환
예시1)
f= open("class.txt","r")
a=f.read()
print(a)
f.close # read()로 읽으면 한개의 문자열 데이터로 나옴
예시2)
f= open("class.txt","r")
for rline in range(5):
a=f.readline() # readline은 한줄씩 읽으므로 range(5)로 5번 읽음
print(a)
f.close()
이때 파일에서 다음줄을 나타내기 위해서 줄바꿈문자 (\n)을 사용
readline 함수 실행시 줄바꿈문자도 같이 읽음
print문에서 내용 출력시 자동으로 줄을 바꾸므로 줄이 두번 바뀌는 현상이 나타남
-여러 함수 와 구문
tell()함수 : 현재 파일이 어디까지 읽고 썼는지 나타냄
seek()함수 : 사용자가 원하는 위치로 파일 포인터를 이동
with 구문을 이용하면 자동적으로 close를 처리하기 때문에 더 편리하다
with 구문 구조
with open(파일위치, 모드) as file:
수행할 명령어
with open("class.txt","r") as file: # 콜론(:)을 반드시 붙여야함
while True:
rline=file.readline()
if not rline: # 문장이 끝나면 False값을 가진다
break
print(rline,end="")
예시) booklist.txt파일을 읽어서 총 판매권수와 총 판매금액을 계산하는 프로그램
총판매가격과 총판매권수는 tot_price, tot_cnt는 빈 list로 선언, 구분자는 -
fb=open("booklist.txt","r")
tot_price=[]
tot_cnt=[]
for x in fb:
rlines=x.split("-") # 구분자 - 로 나눠서 리스트로 저장함
title=rlines[0]
cnt=int(rlines[1])
price=int(rlines[2])
total=int(rlines[3])
tot_price.append(total)
tot_cnt.append(cnt)
print("총 판매가격은",sum(tot_price))
print("총 판매권수는", sum(tot_cnt))
fb.close()
9-2 pickle 함수와 예외처리
-기타 데이터형 읽고 쓰기
pickle로 파이썬의 모든 자료형 저장 가능(기본 자료형도 가능)
pickle로 파일을 읽을 때에는 반드시 바이너리 모드로 파일을 읽어야 함
pickle 모듈 사용
- dump 함수 : 리스트, 집합 등의 데이터 타입을 파일로 저장
- load 함수 : 저장딘 내용을 읽어들임
예시) 서점에서 책을 주문한 후 총 주문액을 저장하는 프로그램
엑셀 : 2000원, 파이썬 : 3000원, 자바 : 5000 원
종료라고 입력하면 입력을 종료
주문한 책과 주문액을 book 파일에 저장
book 파일을 읽어서 책과 주문금액을 출력
import pickle # 모듈을 사용할땐 import를 이용함
bPrice={"엑셀":2000,"파이썬":3000,"자바":5000}
book=input("주문할 책 제목")
bSales={"엑셀":0,"파이썬":0,"자바":0} # 초기에는 다 0으로 설정
while(book!="종료"):
bSales[book]+=bPrice[book] # 파이썬을 주문하면 key인 파이썬의 value에 가격 추가
book=input("주문할 책 제목")
f=open("book","wb") #바이너리로 파일을 열땐 b를 붙여서 wb로 사용
pickle.dumb(bSales,f) #print문과 같이 dump를 이용해서 저장하고 연결할 파일 f도 작성
f.close()
print("정상적으로 파일 저장")
bSales.clear() # 다음 사용을 위해 리셋시킴
f=open("book","rb") # 바이너리 파일을 읽음
bSales=pickle.load(f)
for x in bSales:
print("주문한 책은",x,"이고 총 주문금액은",bSales[x],"입니다.") # 각각 책 제목(key)와 가격(value)를 print
f.close()
print("정상적으로 파일 읽음")
- 예외 처리
프로그램이 동작하던 중 오류등의 예외 상황일 경우
try, except문을 사용한다
- 구조
try:
명령어
except 에러 종류 :
대처 내용
예시)
try:
with open("file.txt","r") as file:
while True:
rline=file.readline()
if not rline : break
print(rline,end="")
except FiileNotFoundError:
print("파일명이 존재하지 않습니다.")
except Exception:
print("에러가 발생했습니다.")