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
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 도서관 출납 시스템_18일차_var. 0.2.0 (3) | 2024.07.24 |
---|---|
#파이썬 도서관 출납 시스템_18일차_var. 0.1.0 (0) | 2024.07.24 |
#파이썬 도서관 출납 시스템_16일차 (1) | 2024.07.22 |
#파이썬 기초 16일차 (0) | 2024.07.22 |
#파이썬 기초 15일차 (0) | 2024.07.19 |