SW과정 머신러닝 1006(2)

JongseokLee·2021년 10월 6일
0
post-thumbnail

SW과정 머신러닝 1006(2)

1. 크롤링

CSV

콤마(,)로 구분된 값
JSON + XML
일반적인 데이터베이스

기본틀

from urllib import request

url = 'https://www.naver.com/'
data = request.urlopen(url)
print(data.read().decode('utf-8'))

urllib, request 기본틀

from urllib import parse,request
#https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%A0%9C%EC%A3%BC%EC%97%AC%ED%96%89


query = input('검색어 >>> ')
values = {
    'where':'nexearch',
    'sm':'top_hty',
    'fbm':'1',
    'ie':'utf8',
    'query':query
}

params = parse.urlencode(values)
print(params)
url = 'https://search.naver.com/search.naver?'+params

data = request.urlopen(url).read().decode('utf-8')
print(data)

2. 고객관리 클래스(Customer)

import re, sys
class Customer:
    custlist=[{'name': '홍길동', 'gender': 'M', 'email': 'hong123@gmail.com', 'birthyear': '2000'},
            {'name': '박철수', 'gender': 'M', 'email': 'park01@gmail.com', 'birthyear': '2002'},
            {'name': '김나리', 'gender': 'F', 'email': 'kim123@gmail.com', 'birthyear': '1999'} ]
    page = 2
    #클래스 안에있는 메서드 중에서 인스턴스 메서드만 self 씀
    def insertData(self):
        customer = {'name':", 'gender':", 'email':", 'birthday':"}
        customer['name'] = input('이름 >>>')
        while True:
            customer['gender'] = input('성별(M,F)>>>').upper()
            #customer['gender'] =customer['gender'].upper()
            if customer['gender'] in('M','F'):
                break
        while True:
            email_p = re.compile('^[a-z][a-z0-9]{4,}@[a-z]{2,6}[.][a-z]{2,5}$')
            while True:
                customer['email'] = input('이메일>>>')
                if email_p.match(customer['email']):
                    break
                else:
                    print('이메일을 정확하게 입력해주세요')
            check = 0
            for i in Customer.custlist:
                if i['email'] == customer['email']:
                    check = 1
            if check==0:
                break
            print('중복되는 이메일이 있습니다.')
        while True:
            customer['birthyear'] = input('생년월일(4자리) >>> ')
            if len(customer['birthyear']) == 4 and customer['birthyear'].isdigit():
                break

        Customer.custlist.append(customer)
        Customer.page = len(Customer.custlist)-1
        print(Customer.custlist)

    def curSearch(self):
        if Customer.page < 0:
            print('입력된 정보가 없습니다.')
        else : 
            print(f'현재 페이지는 {Customer.page}페이지 입니다.')
            print(Customer.custlist[Customer.page])
        return Customer.page

    def preSearch(self):
        if Customer.page <= 0:
            print('첫번째 페이지')
            print(Customer.page)
        else:
            Customer.page -= 1
            print(f'현재 페이지는 {Customer.page}페이지 입니다.')
            print(Customer.custlist[Customer.page])

    def nextSearch(self):
        if Customer.page >= len(Customer.custlist) -1:
            print('마지막 페이지입니다.')
            print(Customer.page)
        else:
            Customer.page += 1
            print(f'현재 페이지는 {Customer.page}페이지 입니다.')
            print(Customer.custlist[Customer.page])

    def updateData(self):
        while True:
            choice1 = input('수정하려는 이메일 주소를 입력하세요 >>>')
            idx = -1
            for i in range(len(Customer.custlist)):
                if Customer.custlist[i]['email'] == choice1:
                    idx = i
                    break
            if idx == -1:
                print('등록되지 않은 이메일입니다.')
                break
            choice2 = input('''
    -----------------------------------------------
    다음 중 수정할 항목을 선택하세요(수정할 정보가 없으면 exit 입력)            
    name, gender, birthyear 중 입력
    -----------------------------------------------
            ''')
            if choice2 in ('name', 'gender', 'birthyear'):
                Customer.custlist[idx][choice2] = input('수정할 {}를 입력하세요 >>>'.format(choice2))
                print(Customer.custlist[idx])
                break
            elif choice2 == 'exit':
                break
            else: 
                print('존재하지 않는 항목입니다.')
                break

    def deleteData(self):
        choice1 = input('삭제하려는 이메일 주소를 입력하세요 >>>')
        delok = 0
        for i in range(len(Customer.custlist)):
            if Customer.custlist[i]['email'] == choice1:
                print('{} 고객님의 정보가 삭제되었습니다.'.format(Customer.custlist[i]['name']))
                del Customer.custlist[i]
                delok = 1
                print(Customer.custlist)
                break

    def exe(self, choice):
        if choice=='I':
            self.insertData()
        elif choice=='C':
            self.curSearch()
        elif choice=='P':
            self.preSearch()
        elif choice=='N':
            self.nextSearch()
        elif choice=='U':
            self.updateData()
        elif choice=='D':
            self.deleteData()
        elif choice=='Q':
            sys.exit()

    def display():
        choice=input('''
    다음 중에서 하실 일을 골라주세요 :
    I - 고객 정보 입력
    C - 현재 고객 정보 조회
    P - 이전 고객 정보 조회
    N - 다음 고객 정보 조회
    U - 고객 정보 수정
    D - 고객 정보 삭제
    Q - 프로그램 종료
    ''').upper()
        return choice

    def __init__(self):
        while True:
            self.exe(self.display())

#프로그램 실행
Customer()

3. 은행업무 클래스(Account)

# 은행 계좌를 클래스로 작성하시오
# 클래스 변수를 이용하여 계좌가 개설된 건수를 체크하고 출력하는 클래스함수를 작성합니다.
# 아래의 내용은 인스턴스 함수와 변수로 작성합니다.
# 계좌는 이름과 금액을 입력받고, 계좌번호는 자동으로 생성합니다.
# 입금은 0보다 큰금액을 입력해야하며 로그에 입금내역을 기록합니다.
# 입금 횟수에 따라 1%의 이자가 지급됩니다.(5회마다)
# 출금은 잔액보다 작을경우에 처리됩니다. 로그에 출금 기록을 남깁니다.
# 계좌정보를 출력하는 함수는 은행이름,예금주,계좌번호,잔고를 출력합니다.
# 입금내역과 출금내역을 출력하는 함수

class Account:
    account_count = 0 

    @classmethod
    def get_account_count():
        print('계좌수 : ',Account.account_count)
    
    def __init__(self,name,balance):
        Account.account_count += 1
        self.name =name
        self.balance = balance
        self.deposit_count = 0
        self.total_log = []
        self.account_number = Account.account_count

    def deposit(self,amount):
        if amount >= 1:
            self.total_log.append(('입금',amount))
            self.balance += amount
            print(f'{amount:,.1f}원이 입급처리되었습니다. 총 금액은 {self.balance:,}입니다.')
            self.deposit_count += 1
            if self.deposit_count % 5 == 0:
                interest = self.balance * 0.01
                self.balance  += interest
                self.total_log.append(('이자지급',interest))
                print(interest,'원의 이자가 지급되었습니다.')

    def withdraw(self,amount):
        if self.balance >= amount:
            self.balance -= amount
            self.total_log.append(('출금',amount))
            print(f'{amount:,}원이 출금되었습니다.')
        else:
            print('잔액이 부족합니다.')

    def __str__(self):
        return f'예금주 : {self.name}, 계좌번호 : {self.account_number}, 잔고 : {self.balance:,.0f} '


import pickle,os

account_list=[]
# account_list 불러오기
dir = os.path.dirname(__file__)+'/account.pickle'

with open(dir,'rb') as f:
    account_list = pickle.load(f)

Account.account_count = account_list[-1].account_number

while True:
    display = '''
----------------------------------------------------------------------
1. 계좌개설  2. 입금  3. 출금  4. 계좌로그  5. 계좌정보  6. 종료   
----------------------------------------------------------------------
>>>  '''
    menu = input(display)
    if menu == '1':
        name=input('이름 >>> ')
        balance=''
        while not balance.isdecimal():
            balance= input("입금금액 >>>")
        balance = int(balance)
        account_list.append( Account(name,balance))
        print('-------------------')
        for item in account_list:
            print(item)
    elif menu =='2':
        account_num = int(input('계좌번호 입력하세요 >>> '))
        check = 0
        for acc in account_list:
            if acc.account_number == account_num:
                check = 1 
                amount =int(input('입금 금액 >>> '))
                acc.deposit(amount)
        if check == 0:
            print('계좌번호가 없습니다.')
    elif menu == '3':
        account_num = int(input('계좌번호 입력하세요 >>> '))
        check = 0
        for acc in account_list:
            if acc.account_number == account_num:
                check = 1 
                amount =int(input('출금 금액 >>> '))
                acc.withdraw(amount)
        if check == 0:
            print('계좌번호가 없습니다.')
    elif menu == '4':
        account_num = int(input('계좌번호를 입력하세요 >>> '))
        check = 0
        for acc in account_list:
            if acc.account_number ==account_num:
                check = 1
                for data in acc.total_log:
                    print(data[0],' : ',data[1])
        if check == 0:
            print('계좌번호가 없습니다.')
    elif menu == '5':
        for acc in account_list:
            print(acc)
        account_num = int(input('계좌번호를 입력하세요 >>> '))
        check = 0
        for acc in account_list:
            if acc.account_number ==account_num:
                check = 1
                print(acc)
        if check == 0:
            print('계좌번호가 없습니다.')
    elif menu =='6':
        ## account_list 저장
        with open(dir,'wb') as f:
            pickle.dump(account_list,f)
        print('프로그램 종료!')
        break
    
profile
DataEngineer Lee.

0개의 댓글