본문 바로가기

PYTHON-BACK

#파이썬 도서관 출납 시스템_17일차

728x90
'''
도서 관리 프로그램 (클래스 및 파일 입출력 포함)

- 도서 관리 프로그램은 콘솔 응용 프로그램이다.
- 응용에서는 사용자와 상호작용을 담당한다.
- 응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
- 메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
- 장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다.
- 도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다.
- 도서는 ISBN(주요키), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다.
- 도서 삭제 기능에서는 도서의 ISBN을 사용자로부터 입력받아 삭제한다.
- 도서 검색 기능에서는 도서의 ISBN을 사용자로부터 입력받아 검색한다.
- 전체 보기에서는 전체 도서 정보를 출력한다.
- 프로그램 종료할 때 데이터를 파일에 저장하고 프로그램 시작할 때 로딩한다.

'''

 

인터프린터, HTML 같은 코드들은 소스코드가 보이는 경우가 있음(첫 페이지에) 이떄 보안성 문제가 될 수 있으므로

첫 진입점 코드의 경우 코드를 짧게 만들어서 보안성이 높게 작업하는 경우가 많다.

 

위 내용들 중에 기능들은 별도의 클래스로 구현, 값 데이터를 제어하는 클래스로 나눠서 구현

 

저번시간에 함수만 이용해서 구현한 것을 클래스 및 파일 입출력과 함수를 같이 이용해서 구현

 

newlib03.py

from newAppl import Application

def main():
    app = Application()
    app.Run()

if __name__ == "__main__":
    main()

 

newBook.py

class Book: #생성시
    def __init__(self, category, title, author, isbn, publisher, price):
        self.category = category
        self.title = title
        self.author = author
        self.isbn = isbn
        self.publisher = publisher
        self.price = price

    def write(self, fs): #write시
        fs.write(str(self.category) + ",")
        fs.write(self.title + ",")
        fs.write(self.author + ",")
        fs.write(self.isbn + ",")
        fs.write(self.publisher + ",")
        fs.write(str(self.price) + "\n")

    @staticmethod
    def load(fs): # load시
        data = fs.readline()
        elems = data.split(',')

        if len(elems) < 6:
            return None
       
        category = elems[0]
        title = elems[1]
        author = elems[2]
        isbn = elems[3]
        publisher = elems[4]
        price = elems[5]

        return Book(category, title, author, isbn, publisher, price)

 

newAppl.py

import os
from newBook import Book

class Application:
    def __init__(self):
        self.lsCategory = list()
        self.lsBook = list()

    def Run(self):
        self.loadData()
        while True:
            menu = self.selectMenu()

            if menu == "0":
                break
            elif menu == "1":
                self.addCategory()
            elif menu == "2":
                self.addBook()
            elif menu == "3":
                self.delBook()
            elif menu == "4":
                self.searchBook()
            elif menu == "5":
                self.viewBookList()
            else:
                print("메뉴를 잘못 선택했습니다!")

            input("아무 키나 눌러주세요...")

        self.saveData()

    def loadData(self):
        self.loadCategory()
        self.loadBooks()

    def loadCategory(self):  
        if os.path.exists("category.csv"):
            with open("category.csv", "r", encoding="utf-8") as fs:
                data = fs.read()
                self.lsCategory = data.split("\n")
                self.lsCategory = [category for category in self.lsCategory if category]

    def loadBooks(self):
        if os.path.exists('book.csv'):
            with open('book.csv', 'r') as fs:
                while True:
                    book = Book.load(fs)
                    if book is None:    
                        break
                    self.lsBook.append(book)

    def saveData(self):
        self.saveCategory()
        self.saveBooks()

    def saveCategory(self):
        with open("category.csv", "w") as fs:
            for category in self.lsCategory:
                fs.write(category + "\n")

    def saveBooks(self):
        with open("book.csv", "w") as fs:
            for book in self.lsBook:
                book.write(fs)

    def selectMenu(self):
        os.system('cls')  # Windows에서는 'cls', macOS/Linux에서는 'clear'

        print("===========================")
        print("도서관 출납 관리 프로그램 ver. 0.1.0")
        print("===========================")
        print()
        print("1: 카테고리 추가")
        print("2: 도서 추가")
        print("3: 도서 삭제")
        print("4: 도서 검색")
        print("5: 전체 보기")
        print("0: 종료")
        print()
        return input("메뉴 선택: ")

    def viewCategoryList(self):
        print("[등록된 카테고리: {}개]".format(len(self.lsCategory)))
        for i, category in enumerate(self.lsCategory):
            print("{}: {}".format(i + 1, category), end="    ")
        print()

    def addCategory(self):
        print("=========카테고리 추가=========")
        self.viewCategoryList()

        category_name = input("카테고리 명: ")
        self.lsCategory.append(category_name)

    def addBook(self):
        print("=========도서 추가=========")
        self.viewCategoryList()
        category_code = input("\n카테고리 번호: ")
        category_code = int(category_code) - 1

        if category_code < 0 or category_code > len(self.lsCategory) - 1:  # len하면 하나 큰 값이 넘어감으로 -1 해줌
            print("잘못 선택하셨습니다.")
            return
       
        isbn = input("ISBN: ")
        check_isbn = self.findISBN(isbn)
        if check_isbn != 1:
            print("이미 존재하는 ISBN입니다.")
            return

        title = input("도서명: ")
        author = input("저자: ")
        publisher = input("출판사: ")
        price = input("가격: ")

        book = Book(category_code, isbn, title, author, publisher, price)
        self.lsBook.append(book)

    def delBook(self):
        print("=========도서 삭제=========")
        isbn = input("삭제할 도서의 ISBN: ")
        found_isbn = self.findISBN(isbn)

        if found_isbn == -1:  # 못찾을 경우 -1
            print("존재하지 않는 ISBN입니다.")
            return
       
        book = self.lsBook.pop(found_isbn)
        print("삭제된 도서: [{}] {} - {} ({}, ISBN:{}) {}원".format(self.lsCategory[book[0]], book[2], book[3], book[4], book[1], book[5]))
       
    def findISBN(self, isbn):
        for i in range(len(self.lsBook)):
            book = self.lsBook[i]

            if book[1] == isbn:
                return i
           
        return -1

    def searchBook(self):
        print("=========도서 검색=========")
        isbn = input("검색할 도서의 ISBN: ")
        found_isbn = self.findISBN(isbn)

        if found_isbn == -1:
            print("존재하지 않는 ISBN입니다.")
            return

        book = self.lsBook[found_isbn]
        print("[{}] {} - {} ({}, ISBN:{}) {}원".format(self.lsCategory[book[0]], book[2], book[3], book[4], book[1], book[5]))

    def viewBookList(self):
        print("=========전체 보기=========")
        print("[등록된 도서: {}개]".format(len

 

다음에는 기존에 공부했던 파이썬 GUI 라이브러리 중 하나인 tkinter를 사용하여 CSV파일 기반의 도서관리 프로그램 구현을 진행해보겠습니다.

728x90