try : 예외가 발생할 가능성이 있는 구문 except : 예외가 발생했을 때 수행할 내용
#예외가 어디에서 발생하는지 확인을 먼저 하자. ar=[10,20,30] #문자 혹은 0을 넣으면 여러 예외 발생! try: num=int(input("나눌 수를 입력하세요")) i=0 #len(ar)은 변하지 않음(고정), 비효율적임 #왜냐? 함수를 통해 가져오기 때문이다. j=len(ar) #이렇게 하면 함수 호출을 한 번만 하기에 #메모리 낭비가 없이 효율적이다. while i<j: print(ar[i]/num) i=i+1 except: print("예외 발생!")
#예외가 어디에서 발생하는지 확인을 먼저 하자. ar=[10,20,30] #문자 혹은 0을 넣으면 여러 예외 발생! try: num=int(input("나눌 수를 입력하세요")) i=0 #len(ar)은 변하지 않음(고정), 비효율적임 #왜냐? 함수를 통해 가져오기 때문이다. j=len(ar) #이렇게 하면 함수 호출을 한 번만 하기에 #메모리 낭비가 없이 효율적이다. while i<j: print(ar[i]/num) i=i+1 except ValueError: print("잘못된 데이터 입력!") except ZeroDivisionError: print("0으로는 나눌 수 없습니다!") #예외는 value 에러와 zerodivision 에러가 있는데 #한 곳에서 처리하고 있다.
예외 발생 사실만을 아는 것 뿐만 아니라, 어떤 예외가 발생하였는지 알 수 있다.
except 예외클래스이름 as 변수명 :
except ValueError as e: print(e) except ZeroDivisionError as e: print(e)
invalid literal for int() with base 10: '1d'
division by zero
except ValueError as e: print("잘못된 데이터 입력!") print(e) except ZeroDivisionError as e: print("0으로는 나눌 수 없습니다!") print(e) #예외는 value 에러와 zerodivision 에러가 있는데 #한 곳에서 처리하고 있다. else : print("예외가 발생하지 않은 경우 수행할 내용") finally : print("무조건 수행하는 문장 ") #finally 나오면 else 안나옴
근데 보통은 else 잘 안쓰긴 합니다.
raise Exception(메시지):
현재 함수 내에서 예외를 처리합니다.raise
: 호출하는 함수로 예외를 던지기while i<j: if num==1: raise ValueError("강제 예외 발생")
assert 프록램이 중단되지 않는 조건[, 에러 메시지])
#num의 값이 2라면 메시지를 출력하고 프로그램 중단합니다.
assert num!=2, "num은 2이면 안됩니다."
\n
이 포함된 컬렉션의 경우는 writelines
나 join
을 이용해서 줄 단위 기록이 가능read()
는 전체를 읽고, readline()
는 줄단위로 읽고, readlines()
는 줄 단위로 읽어서 list로 리턴하며, read(정수)
는 정수 바이트 만큼 읽어옵니다.os.getcwd()
: 현재 작업 디렉토리 리턴os.chdir('디렉토리')
: 현재 작업 디렉토리 변경import os #상대경로를 설정할 때, 기준 경로가 됩니다. #print(os.getcwd()) try: file=open('./docs/test.txt',encoding="utf-8") # file.write("utf-8로 인코딩했어요\n")#문자열 기록 # lines=["mino","mino2","mino3"] # file.writelines(lines) # content=file.read() #전체 읽기 # print(content) # #줄 단위로 읽어보자. # for line in file: # print(line) # print() except Exception as e: print("파일 처리 중 예외 발생", e) finally: file.close()
파일을 열어서 깨지면, 인코딩 작업을 해준다.
help(open)
하면 어디에 어떻게 쓸지 확인할 수 있다.
with open() as 파일변수:
위와 같이 작성하게 되면 open의 return 값을 파일 변수에 저장하고, with 절이 끝나면 예외 발생 여부에 상관 없이 자동으로 close를 호출합니다.
with open('./docs/test.txt',encoding='utf-8') as file: for line in file: print(line) print()
import csv #텍스트 파일을 읽어서 list로 변환 #마지막 데이터에 \n이 추가됩니다. #이를 제거해야 합니다. data=[] with open('./docs/한국주택금융공사_채권계산서 출력이력 _20201030.csv') as file: for line in file: # ar=line.split(",") # ar = [item.strip() for item in ar] #줄바꿈 문자 제거 # data.append(ar) 줄 단위로 읽어서 list를 만들어주는 reader 객체를 생성 rdr=csv.reader(file) for line in rdr: data.append(line) print(data)
csv.writer에 파일 객체를 대입하면 csv에 기록이 가능한 객체를 생성할 수 있는데, 이 객체를 가지고 wirterow(list)를 호출하면 csv파일에 기록도 가능합니다.
w 모드로 열면 기존 내용을 모두 지우고, a모드로 열면 기존 내용 뒤에 추가를 합니다.
import csv data=[] with open('./docs/한국주택금융공사_채권계산서 출력이력 _20201030.csv','a') as file: #쓰기모드 하려면 'w' 하지만 이는 지우고 함 #그러기에 'a'를 사용한다. a는 추가하는 것이다. #쓰기 wr=scv.writer(file) wr.writerrow([데이터 입력])x` wr.writerrow([데이터 입력]) print(data)
b
를 추가합니다. (wb, rb
)data=[] with open('./docs/test.bin','wb') as file : #바이너리라 인코딩 필요없음 file.write("안녕하세요".encode()) with open('./docs/test.bin','rb') as file : content=file.read() print(content) print(content.decode())
저렇게 읽으면 b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94' 이렇게 나온다.
pickle.dump(출력할 객체, 파일객체)
pickle.load(파일객체)
: 객체를 1개 읽기pickle.loads(파일 객체)
: 객체를 전부 읽기class DTO: def __init__(self, num=0, name="이름 없음"): self.__num=num self.__name=name #__붙이면 private, 인스턴스 접근불가 @property #getter를 만들어보자. def num(self): return self.__num @property def name(self): return self.__name @num.setter #setter 만들어보자. def num(self,num): self.__num=num @name.setter def name(self,name): self.__name=name #instance를 print함수에 대입했을 때, 호출되는 메서드 - 오버라이딩 #출력을 편리하게 하기 위해서 재정의 - 디버깅 목적 def __str__(self): return str(self.__num)+" : "+str(self.__name) dto1=DTO(1,"mino1") dto2=DTO(2,"mino2") data=[dto1,dto2] import pickle try: with open("./docs/data.dat","wb") as f: #f에 data를 Serializable(직렬화) pickle.dump(data,f) except Exception as e: print(e)
그냥 열어보면 이렇게 나온다.
? ]??main뵆DTO뵑?걫}??_DTOnum봌?_DTOname뵆mino1봴bh)걫}?hKh?mino2봴be.
try: with open("./docs/data.dat","rb") as f: result=pickle.load(f) for dto in result: print(dto) except Exception as e: print(e)
result는
[<main.DTO object at 0x0000022A3C059AE0>, <main.DTO object at 0x0000022A3C05B6A0>]
이것을 deserializable하면
1 : mino1
2 : mino2
import zipfile #파일의 목록 생성 filelist=["./docs/data.dat","./docs/test.bin"] #파일 목록을 순회하면서 압축 with zipfile.ZipFile('./docs/test.zip','w') as myzip: for temp in filelist: myzip.write(temp) #압축 해제 zipfile.ZipFile("./docs/test.zip").extractall()
180.76.15.5 - - [15/Nov/2015:03:45:45 +0000] "GET / HTTP/1.1" 200 6812
로그 파일 읽어서 확인할 것 (쿠팡 문제)
1. 성공한 개수
2. IP 별 접속 횟수
3. IP 별 트래픽 합계
생각할 것 : 그룹핑 -> dict , counter
from collections import Counter ipCount={} response200=0 ipTraffic={} try: with open('./docs/log.txt','r') as f: for line in f: ar=line.split(" ") ar=[itemp.strip() for itemp in ar] #응답 횟수 카운트하기 if (ar[8]==str(200)): response200+=1 #ar[0]=ip, ar[0]을 key로 해서 ar[0]의 값에 #1을 더하기 ipCount[ar[0]]=ipCount.get(ar[0],0)+1 #ip별 트래픽 합계를 구하기, 마지막 항목이 트래픽임 #합계를 구하려면 정수로 변환해야 합니다. #counter도 가능합니다. try: ipTraffic[ar[0]]= ipTraffic.get(ar[0],0)+int(ar[9]) #그냥 예외처리 해버리면 끝나네..? except: pass for ip in ipCount: print(ip," : " ,ipCount[ip]) for ip in ipTraffic: print(ip," : " ,ipTraffic[ip]) except Exception as e: print(e) print("에러") finally : print("끝")
예외처리하니까 끝나네
중복된거 계산은 dict, counter만 기억해내자!!
상위 10개 뽑아보기
Counter가 좋아요counter=Counter(ipTraffic) print(counter.most_common(10))
끝났네?
-grant revoke : 관리자 언어가 맞지만 밑에는 개발자 언어다.
CI 코드 작성시 빌드까지 자동화 되어 나오는 것
CD 클라우드 등 배포
설치를 합니다.
docker run --name 컨테이너이름 -dit -net=네트워크이름 -e MYSQL_ROOT_PASSWORD=관리자비밀번호 -e MYSQL_DATABASE=데이터베이스이름 -e MYSQL_USER=사용자이름 -e MYSQL_PASSWORD=사용자비밀번호 -p 호스트포트번호:컨테이너포트번호 mysql이미지이름 --character-setserver=문자인코딩 --collation-server=정렬순서 --defaultauthentication-plugin=인증방식