데이터 관리 프로그램 만들기(1) - 파일 시스템 활용

미남로그·2021년 8월 25일
0

문제 설명

employeefile.txt 파일을 활용하여 사원 정보 프로그램을 만들어 보겠습니다. 사원들의 월급을 계산하고, 월급이 가장 높은 사원을 찾는 프로그램을 만들 예정입니다.

summarize() 함수와 의사코드

def summarize():
    #파일 이름을 입력받는다.
    #파일을 읽기 모드로 열어 한 줄씩 파일을 읽는다. 
    #파일의 각 행의 데이터 속성을 갖는 인스턴스 객체(사원객체)를 만든다. 
      # 사전에 employee 클래스 설계 필요!
      # 사전에 인스턴스 사원 객체를 만드는 함수 필요!  
    #월급이 가장 높은 사원을 찾는 코드를 구현한다. 
    #결과를 출력한다. 
    pass

Employee class 설계

인스턴스 변수 name, division, jobgrade, year, basic을 갖는 Employee class를 활용해 보겠습니다.

class Employee:
	def __init__(self, name, division, jobgrade, year, basic):
    	self.name = name
        self.divisin = division
        self.jobgrade = int(jobgrade)
        self.year = int(year)
        self.basic = float(basic)

# 텍스트 파일에서 불러온 각각의 데이터는 string으로 처리되기 때문에, 형 변환은 필수입니다.

설계한 employee 클래스에서 "안태희(AhnTaeHee)"라는 사원 정보를 인스턴스 객체로 만들어 employee 변수로 지정해 봅시다. 아직은 하드 코딩으로 직접 매개변수 값을 입력해줍니다.

employee1 = Employee('AhnTaeHee', 'AI Team', '3', '3', '300')

make_employee() 함수 선언

텍스트 형식의 파일을 파싱해 employee 클래스 인스턴스를 생성하기. 위 처럼 employee1, ..., employee(n) 까지 갈 수 없기 때문에 함수를 만들어 줍니다.

def make_employee(inputdata):
	name, division, jobgrade, year, basic = inputdata.split(',')
    	return Employee(name, division, jobgrade, year, basic)
import os
# 파일 경로 지정
file_path = os.getenv("Home") + '/aiffel/data_handling/data/employeefile.txt'
# 파일 경로 확인
print(file_path)
# read 모드로 file open
inputdata = open(file_path, 'r')

# file에서 사원 정보를 확인하는 함수 반복 호출
for i in inputfile:
	e = make_employee(i)

Employee class 재설계

<인스턴스>, <속성값> 과 같은 형식으로 인스턴스 변수에 접근할 수 있지만, 보통은 메소드로 구현해 값을 반환하는 방식이 일반적입니다. 이는 Clean Code 운동과 관련된 내용입니다.

정보 접근자 메소드

class Employee:
	def get_name(self):
    		return self.name
    	def get_division(self):
        	return self.division
        def get_jobgrade(self):
        	return self.jobgrade
        def get_years(self):
        	return self.years
        def get_basic(self):
        	return self.basic

급여 계산

급여는 기본 급여(basic salary)에 기본 급여의 10% 근속 연수를 더한 값입니다. 즉, 급여는 basic salary + years basic 0.1 과 같이 계산할 수 있습니다.

def get_salary():
	self.salary = self.basic + (self.years * self.basic * 0.1)
   	return self.salary

완성된 Employee class!

class employee:
    def __init__(self,  name, division, jobgrade, years, basic):
    	self.name = name
        self.division = division
        self.jobgrade = jobgrade
        self.yeras = years
        self.basic = basic
        self.salary = 0
	
    def get_name(self):
    	return self.name
    def get_division(self):
    	return self.division
    def get_jobgrade(self):
    	return self.jobgrade
    def get_years(self):
    	return self.years
    def get_basic(self):
    	return self.basic
    def get_salary(self):
    	self.salary = self.basic + (self.basic * self.years * 0.1)
        return self.salary

전체 코드

class employee:
    def __init__(self,  name, division, jobgrade, years, basic):
    	self.name = name
        self.division = division
        self.jobgrade = jobgrade
        self.yeras = years
        self.basic = basic
        self.salary = 0
	
    def get_name(self):
    	return self.name
    def get_division(self):
    	return self.division
    def get_jobgrade(self):
    	return self.jobgrade
    def get_years(self):
    	return self.years
    def get_basic(self):
    	return self.basic
    def get_salary(self):
    	self.salary = self.basic + (self.basic * self.years * 0.1)
        return self.salary
        
        
def make_employee(inputdata):
    name, division, jobgrade, year, basic = inputdata.split(',')
    return Employee(name, division, jobgrade, year, basic)
    
def summarize():
    file_path = os.getenv("HOME") + '/aiffel/data_handling/data/employeefile.txt'
    inputfile = open(file_path, 'r')
    highest = make_employee(inputfile.readline())
    for l in inputfile:
    	e = make_employee(l)
        if e.get_salary() > highest.get_salary():
    		highest = e
    inputfile.close()
    
    print("The name of the highest slary employee is: ", highest.get_name())
    print("Years of service: ", highest.get_yours())
    print("Division: ", highest.get_years())
    print("Salay: ", highest.get_salary())
          

class를 만들었고, summarize() 메소드를 호출하여 기획 의도대로 동작하는지 살펴보기

summarize()

실행 결과

지금은 txt 파일 하나만 이용한 데이터를 활용한 실습입니다. 앞으로는 여러 파일과 다양한 데이터 항목 등이 섞인 복잡한 데이터가 있을텐데, pandas를 활용하는 것이 효율적일 수 있습니다!

다음 글

데이터 관리 프로그램 만들기(2) - Pandas와 csv 파일

데이터베이스 정리 글

  1. 데이터 관리 프로그램 만들기(1) - 파일 시스템 활용
  2. 데이터 관리 프로그램 만들기(2) - Pandas와 csv 파일
  3. 데이터베이스(3) SQL - DDL, DML, DCL
  4. 데이터베이스(4) - 파이썬으로 SQL문 사용하는 기본 동작들
  5. 데이터베이스(5) - DB-API
profile
미남이 귀엽죠

0개의 댓글