python實現(xiàn)停車場管理系統(tǒng)
本文實例為大家分享了python實現(xiàn)停車場管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、需求
1、為一個車位數(shù)量固定的停車場,設計一個管理系統(tǒng);
2、停車信息包括:編號、車牌號(若存在)、類型、車位編號、使用日期、入場時間、單價、費用、經(jīng)手人
3、停車信息存儲在數(shù)據(jù)文件中,程序至少實現(xiàn)功能:瀏覽、查詢、入場、出場、導出、計費、系統(tǒng)菜單
4、按面向?qū)ο蟪绦蛟O計方法進行類的定義:選擇合適的數(shù)據(jù)存儲結(jié)構(gòu),并定義相應的數(shù)據(jù)元素類,選擇合理的操作方法定義相應的算法實現(xiàn)類
二、代碼
本系統(tǒng)包含4部分(4個py文件,剩余為測試數(shù)據(jù)文件),組成放在一個文件夾組成一個模塊,如下圖。
2.1 初始化模塊__init__.py
""" __init__.py 模塊的作用:在導入包的時候自動執(zhí)行這里的代碼,進行初始化工作 """ # 允許被 from package_name import * 導入的模塊 __all__ = ['ParkingManagementSystem', 'Car']
2.2 主程序模塊main.py
# coding = utf-8 from ParkingManagementSystem import * from Car import * def main(): ? ? # 創(chuàng)建停車信息管理系統(tǒng)對象 ? ? p = ParkingManagementSystem() ? ? # 創(chuàng)建一個停車對象 ? ? car = Car() ? ? while True: ? ? ? ? print("") ? ? ? ? print("******************* 歡迎進入:停車場信息管理系統(tǒng) *******************") ? ? ? ? print("------------------------- 1.瀏覽所有信息 ------------------------") ? ? ? ? print("------------------------- 2.查詢車輛信息 ------------------------") ? ? ? ? print("------------------------- 3.入場車輛錄入 ------------------------") ? ? ? ? print("------------------------- 4.出場車輛刪除 ------------------------") ? ? ? ? print("------------------------- 5.退出管理系統(tǒng) ------------------------") ? ? ? ? try: ? ? ? ? ? ? # 接收輸入指令 ? ? ? ? ? ? cmd = int(input("請輸入指令數(shù)字:")) ? ? ? ? ? ? # 1.瀏覽所有信息 ? ? ? ? ? ? if cmd == 1: ? ? ? ? ? ? ? ? p.show_all_information() ? ? ? ? ? ? # 2.查詢車輛信息 ? ? ? ? ? ? elif cmd == 2: ? ? ? ? ? ? ? ? while True: ? ? ? ? ? ? ? ? ? ? print("------ 1.按車牌號查找 ------") ? ? ? ? ? ? ? ? ? ? print("------ 2.按車類型查找 ------") ? ? ? ? ? ? ? ? ? ? print("------ 3.按使用日期查找 -----") ? ? ? ? ? ? ? ? ? ? print("------ 4.按經(jīng)手人查找 ------") ? ? ? ? ? ? ? ? ? ? print("------ 5.查詢歷史記錄 ------") ? ? ? ? ? ? ? ? ? ? print("------ 6.返回上級菜單 ------") ? ? ? ? ? ? ? ? ? ? query = int(input("請輸入指令數(shù)字:")) ? ? ? ? ? ? ? ? ? ? # 1.按車牌號查找 ? ? ? ? ? ? ? ? ? ? if query == 1: ? ? ? ? ? ? ? ? ? ? ? ? query_results = p.query_by_car_number() ? ? ? ? ? ? ? ? ? ? ? ? # 判定查詢結(jié)果是否為空(False),是則不保存 ? ? ? ? ? ? ? ? ? ? ? ? if query_results: ? ? ? ? ? ? ? ? ? ? ? ? ? ? decide = input("是否需要保存查詢結(jié)果(輸入:yes/no):") ? ? ? ? ? ? ? ? ? ? ? ? ? ? if decide == "yes": ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p.save_query_results_to_file(query_results) ? ? ? ? ? ? ? ? ? ? # 2.按車類型查找 ? ? ? ? ? ? ? ? ? ? elif query == 2: ? ? ? ? ? ? ? ? ? ? ? ? query_results = p.query_by_car_type() ? ? ? ? ? ? ? ? ? ? ? ? # 判定查詢結(jié)果是否為空(False),是則不保存 ? ? ? ? ? ? ? ? ? ? ? ? if query_results: ? ? ? ? ? ? ? ? ? ? ? ? ? ? decide = input("是否需要保存查詢結(jié)果(輸入:yes/no):") ? ? ? ? ? ? ? ? ? ? ? ? ? ? if decide == "yes": ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p.save_query_results_to_file(query_results) ? ? ? ? ? ? ? ? ? ? # 3.按使用日期查找 ? ? ? ? ? ? ? ? ? ? elif query == 3: ? ? ? ? ? ? ? ? ? ? ? ? query_results = p.query_by_date() ? ? ? ? ? ? ? ? ? ? ? ? # 判定查詢結(jié)果是否為空(False),是則不保存 ? ? ? ? ? ? ? ? ? ? ? ? if query_results: ? ? ? ? ? ? ? ? ? ? ? ? ? ? decide = input("是否需要保存查詢結(jié)果(輸入:yes/no):") ? ? ? ? ? ? ? ? ? ? ? ? ? ? if decide == "yes": ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p.save_query_results_to_file(query_results) ? ? ? ? ? ? ? ? ? ? # 4.按經(jīng)手人查找 ? ? ? ? ? ? ? ? ? ? elif query == 4: ? ? ? ? ? ? ? ? ? ? ? ? query_results = p.query_by_handler() ? ? ? ? ? ? ? ? ? ? ? ? # 判定查詢結(jié)果是否為空(False),是則不保存 ? ? ? ? ? ? ? ? ? ? ? ? if query_results: ? ? ? ? ? ? ? ? ? ? ? ? ? ? decide = input("是否需要保存查詢結(jié)果(輸入:yes/no):") ? ? ? ? ? ? ? ? ? ? ? ? ? ? if decide == "yes": ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p.save_query_results_to_file(query_results) ? ? ? ? ? ? ? ? ? ? # 5.查詢歷史記錄 ? ? ? ? ? ? ? ? ? ? elif query == 5: ? ? ? ? ? ? ? ? ? ? ? ? p.query_history_results() ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? break ? ? ? ? ? ? # 3.錄入車輛信息 ? ? ? ? ? ? elif cmd == 3: ? ? ? ? ? ? ? ? # 接收停車車輛信息 ? ? ? ? ? ? ? ? parking_info = car.get_parking_info() ? ? ? ? ? ? ? ? p.parking(parking_info) ? ? ? ? ? ? # 4.刪除車輛信息 ? ? ? ? ? ? elif cmd == 4: ? ? ? ? ? ? ? ? p.driving_out() ? ? ? ? ? ? # 5.退出管理系統(tǒng) ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? # 保存停車信息的最大編號 id ? ? ? ? ? ? ? ? car.save_id_to_file() ? ? ? ? ? ? ? ? print("感謝使用停車場管理系統(tǒng),再見!") ? ? ? ? ? ? ? ? break ? ? ? ? except Exception as result: ? ? ? ? ? ? # 保存停車信息的最大編號 id ? ? ? ? ? ? car.save_id_to_file() ? ? ? ? ? ? # 保存停車信息 ? ? ? ? ? ? p.save_to_file() ? ? ? ? ? ? print("感謝使用停車場管理系統(tǒng),再見!") ? ? ? ? ? ? break if __name__ == "__main__": ? ? main()
2.3 停車管理模塊ParkingManagementSystem.py
# coding = utf-8 # 模塊中的__all__屬性:可以規(guī)定 模塊中 from module_name import * 只能夠?qū)氲囊恍╊?、變量、函?shù)名 __all__ = ['ParkingManagementSystem'] import time class ParkingManagementSystem(object): ? ? """算法實現(xiàn)類:停車場信息管理系統(tǒng)""" ? ? def __init__(self): ? ? ? ? """對停車信息進行初始化""" ? ? ? ? # 測試時使用 ? ? ? ? print("ParkingManagementSystem的__init__函數(shù)被調(diào)用") ? ? ? ? # 車位編號存放列表 ? ? ? ? self.car_stall = [] ? ? ? ? self.truck_stall = [] ? ? ? ? # 所有停車信息存放列表 ? ? ? ? self.total_info = [] ? ? ? ? # 讀取停車場數(shù)據(jù) ? ? ? ? try: ? ? ? ? ? ? with open("parking_data.txt", "r") as file: ? ? ? ? ? ? ? ? for line in file.readlines(): ? ? ? ? ? ? ? ? ? ? # 將字符串轉(zhuǎn)化為字典,遇到空行時跳過,防止eval()函數(shù)轉(zhuǎn)化空行或者空字符時報錯 ? ? ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? ? ? info_dict = eval(line) ? ? ? ? ? ? ? ? ? ? ? ? self.total_info.append(info_dict) ? ? ? ? ? ? ? ? ? ? ? ? if info_dict["car_type"] == "car": ? ? ? ? ? ? ? ? ? ? ? ? ? ? self.car_stall.append(info_dict["p_number"]) ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? self.truck_stall.append(info_dict["p_number"]) ? ? ? ? ? ? ? ? ? ? except Exception as result: ? ? ? ? ? ? ? ? ? ? ? ? continue ? ? ? ? except Exception as result: ? ? ? ? ? ? print("停車信息數(shù)據(jù)文件不存在!") ? ? ? ? # 測試時使用 ? ? ? ? # print(self.car_stall) ? ? ? ? # print(self.truck_stall) ? ? ? ? # print(self.total_info) ? ? def parking(self, parking_info): ? ? ? ? """入場停車:傳入停車信息,在空的車位中增加車輛信息,更新數(shù)據(jù)文件""" ? ? ? ? # 判斷傳入停車信息是否為 None ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? passs ? ? def show_all_information(self): ? ? ? ? """輸出所有停車場信息,按車位使用情況分類,同一分類中按編號升序排序""" ? ? ? ? # 初始化刷新數(shù)據(jù) ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? pass ? ? def query_by_car_number(self): ? ? ? ? """按車牌號查找停車信息""" ? ? ? ? # 接收車牌編號 ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? pass ? ? def query_by_car_type(self): ? ? ? ? """按車類型查找停車信息""" ? ? ? ? # 接受車類型 ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ?pass ? ? def query_by_date(self): ? ? ? ? """按使用日期查找停車信息""" ? ? ? ? # 接收查詢?nèi)掌? ? ? ? ? date = input("請輸入查詢?nèi)掌冢ǜ袷絽⒖迹?998-06-06):") ? ? ? ? # 創(chuàng)建列表保存查詢結(jié)果 ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ?pass ? ? def query_by_handler(self): ? ? ? ? """按經(jīng)手人查找停車信息""" ? ? ? ? # 接收經(jīng)手人姓名 ? ? ? ? handler = input("請輸入經(jīng)手人姓名:") ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? pass ? ? def query_history_results(self): ? ? ? ? """查詢停車場歷史記錄""" ? ? ? ? # 查詢輸入格式化 ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? print("id ?car_type ?p_number ?car_number ? handler ? price ? ?cost ? ? entrance_time ? ? ? ? ? ?exit_time") ? ? ? ?? ? ? def driving_out(self): ? ? ? ? """出場:刪除對應車位的車輛信息,更新數(shù)據(jù)文件""" ? ? ? ? # 接收出場時間 ? ? ? ? exit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) ? ? ? ? # 接收車牌號 ? ? ? ? car_number = input("請輸入出場車輛車牌號(示例:京A88888):") ? ? ? ? # 遍歷總停車信息列表,找到該條數(shù)據(jù)并將其移除列表 ? ? ? ? pass ? ? def charging(self, info_dict): ? ? ? ? """計費: 傳入停車信息,按小時計費""" ? ? ? ? # 接收車輛停車信息 ? ? ? ? # 將時間由字符串格式轉(zhuǎn)化為數(shù)字格式,以秒為單位 ? ? ? ? exit_time = time.mktime(time.strptime(info_dict["exit_time"], "%Y-%m-%d %H:%M:%S")) ? ? ? ? entrance_time = time.mktime(time.strptime(info_dict["entrance_time"], "%Y-%m-%d %H:%M:%S")) ? ? ? ? # 計算停車時間,單位轉(zhuǎn)化為小時 ? ? ? ? pass ? ? def save_to_file(self): ? ? ? ? """將停車數(shù)據(jù)保存到文件""" ? ? ? ? # 打開數(shù)據(jù)文件,保存數(shù)據(jù) ? ? ? ? with open("parking_data.txt", "w") as file: ? ? ? ? ? ? for info_dict in self.total_info: ? ? ? ? ? ? ? ? # 將字典轉(zhuǎn)化為字符串保存 ? ? ? ? ? ? ? ? file.write(str(info_dict)) ? ? ? ? ? ? ? ? file.write("\n") ? ? def save_history_to_file(self, info_dict): ? ? ? ? """將已完成出場停車數(shù)據(jù)保存到文件""" ? ? ? ? # 打開數(shù)據(jù)文件,保存數(shù)據(jù) ? ? ? ? with open("history_data.txt", "a") as file: ? ? ? ? ? ? # 將字典轉(zhuǎn)化為字符串保存 ? ? ? ? ? ? file.write(str(info_dict)) ? ? ? ? ? ? file.write("\n") ? ? def save_query_results_to_file(self, query_results): ? ? ? ? """將查詢結(jié)果保存到指定數(shù)據(jù)文件""" ? ? ? ? # 接收輸入文件名 ? ? ? ? file_name = input("請輸入要保存數(shù)據(jù)的文件名(格式:xxx.txt ):") ? ? ? ? with open(file_name, "a") as file: ? ? ? ? ? ? # 將數(shù)據(jù)轉(zhuǎn)化為字符串保存 ? ? ? ? ? ? file.write(str(query_results)) ? ? ? ? ? ? file.write("\n") ? ? ? ? print("查詢結(jié)果保存成功,文件名為:%s" % file_name) ? ? def print_func(self, info_dict, query_results): ? ? ? ? """格式化打印輸出查詢結(jié)果""" ? ? ? ? # 需要完整代碼請在文章文章底部添加微信,付費咨詢 ? ? ? ? pass
2.4 車元素模塊Car.py
# coding = utf-8 # 模塊中的__all__屬性:可以規(guī)定 模塊中 from module_name import * 只能夠?qū)氲囊恍╊?、變量、函?shù)名 __all__ = ['Car'] import time from ParkingManagementSystem import * class Car(ParkingManagementSystem): ? ? """數(shù)據(jù)元素類:定義一個關于車的類""" ? ? def __init__(self): ? ? ? ? """對車的屬性進行初始化""" ? ? ? ? # 測試時使用 ? ? ? ? print("Car 中__init__調(diào)用成功!") ? ? ? ? # 設定初始出場時間和消費金額為空 ? ? ? ? self.exit_time = None ? ? ? ? self.cost = None ? ? ? ? # 初始編號 id 為 1 ? ? ? ? self.id = 1 ? ? ? ? # 讀取文件中編號 ? ? ? ? try: ? ? ? ? ? ? with open("count_id.txt", "r") as file: ? ? ? ? ? ? ? ? self.id = int(file.read()) ? ? ? ? except Exception as result: ? ? ? ? ? ? pass ? ? ? ? # 測試時使用 ? ? ? ? print(self.id) ? ? def get_parking_info(self): ? ? ? ? """獲取車輛停車信息""" ? ? ? ? # 調(diào)用父類中的屬性 ? ? ? ? ParkingManagementSystem.__init__(self) ? ? ? ? car_type = input("請輸入車類型(car 或 truck):") ? ? ? ? # 判斷車位是否已滿,如已滿則提示客戶去其他停車場,如未滿則分配一個車位給客戶 ? ? ? ? if car_type == "car": ? ? ? ? ? ? # 如車位已滿,提醒客戶去其他停車場,car類型的車位設定為100個 ? ? ? ? ? ? if len(self.car_stall) >= 100: ? ? ? ? ? ? ? ? print("小汽車車位已滿,請去其他停車場。") ? ? ? ? ? ? ? ? return ? ? ? ? ? ? # 如還有車位,則分配一個車位給客戶 ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? # 不同車型不同價位 ? ? ? ? ? ? ? ? price = 10 ? ? ? ? ? ? ? ? # 車位編號為:1-100 ? ? ? ? ? ? ? ? for i in range(100): ? ? ? ? ? ? ? ? ? ? # 分配空著的車位編號 ? ? ? ? ? ? ? ? ? ? if i + 1 not in self.car_stall: ? ? ? ? ? ? ? ? ? ? ? ? p_number = i + 1 ? ? ? ? ? ? ? ? ? ? ? ? self.car_stall.append(p_number) ? ? ? ? ? ? ? ? ? ? ? ? print(self.car_stall) ? ? ? ? ? ? ? ? ? ? ? ? break ? ? ? ? elif car_type == "truck": ? ? ? ? ? ? # 如車位已滿,提醒客戶去其他停車場,truck類型的車位設定為50個 ? ? ? ? ? ? if len(self.truck_stall) >= 50: ? ? ? ? ? ? ? ? print("貨車車位已滿,請去其他停車場。") ? ? ? ? ? ? ? ? return ? ? ? ? ? ? # 如還有車位,則分配一個車位給客戶 ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? # 不同車型不同價位 ? ? ? ? ? ? ? ? price = 20 ? ? ? ? ? ? ? ? # 車位編號為:101-150 ? ? ? ? ? ? ? ? for i in range(100, 150): ? ? ? ? ? ? ? ? ? ? # 分配空著的車位編號 ? ? ? ? ? ? ? ? ? ? if i + 1 not in self.truck_stall: ? ? ? ? ? ? ? ? ? ? ? ? p_number = i + 1 ? ? ? ? ? ? ? ? ? ? ? ? self.truck_stall.append(p_number) ? ? ? ? ? ? ? ? ? ? ? ? print(self.truck_stall) ? ? ? ? ? ? ? ? ? ? ? ? break ? ? ? ? else: ? ? ? ? ? ? print("本停車場沒有適合該車型的停車位,請重新輸入!") ? ? ? ? ? ? return ? ? ? ? # 接收車位編號 ? ? ? ? car_number = input("請輸入車牌號(示例:京A88888):") ? ? ? ? # 接收經(jīng)手人姓名 ? ? ? ? handler = input("請輸入經(jīng)手人姓名:") ? ? ? ? # 接收入場時間 ? ? ? ? entrance_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) ? ? ? ? # 接收使用日期 ? ? ? ? date = time.strftime("%Y-%m-%d", time.localtime()) ? ? ? ? # 編號 id 自動增長 ? ? ? ? self.id += 1 ? ? ? ? # 保存該條停車信息到字典 ? ? ? ? parking_info = { ? ? ? ? ? ? "id": self.id, ? ? ? ? ? ? "car_type": car_type, ? ? ? ? ? ? "car_number": car_number, ? ? ? ? ? ? "handler": handler, ? ? ? ? ? ? "p_number": p_number, ? ? ? ? ? ? "date": date, ? ? ? ? ? ? "entrance_time": entrance_time, ? ? ? ? ? ? "exit_time": self.exit_time, ? ? ? ? ? ? "price": price, ? ? ? ? ? ? "cost": self.cost ? ? ? ? } ? ? ? ? print(parking_info) ? ? ? ? # 返回車輛停車信息 ? ? ? ? return parking_info ? ? def save_id_to_file(self): ? ? ? ? """保存停車信息的最大編號 id ,作為下次運行id增長的基礎""" ? ? ? ? with open("count_id.txt", "w") as file: ? ? ? ? ? ? file.write(str(self.id))
三、運行測試
3.1 瀏覽所有信息
3.2 查詢車輛信息
3.2.1 按車牌號查找
3.2.2 按車類型查找
3.2.3 按使用日期查找
3.2.4 按經(jīng)手人查找
3.2.5 查詢歷史記錄
3.3 入場車輛錄入
3.4 出場車輛刪除
3.5 退出管理系統(tǒng)
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
深入理解Python虛擬機中字節(jié)(bytes)的實現(xiàn)原理及源碼剖析
在本篇文章當中主要給大家介紹在?cpython?內(nèi)部,bytes?的實現(xiàn)原理、內(nèi)存布局以及與?bytes?相關的一個比較重要的優(yōu)化點——?bytes?的拼接,需要的可以參考一下2023-03-03基于OpenCv實現(xiàn)的人臉識別(附Python完整代碼)
人臉識別是基于人的臉部特征信息進行身份識別的一種生物識別技術(shù),下面這篇文章主要給大家介紹了關于如何基于OpenCv實現(xiàn)的人臉識別,文中還附Python完整代碼,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11Python元組 tuple的概念與基本操作詳解【定義、創(chuàng)建、訪問、計數(shù)、推導式等】
這篇文章主要介紹了Python元組 tuple的概念與基本操作,結(jié)合實例形式詳細分析了Python元組的定義、創(chuàng)建、訪問、計數(shù)、推導式等常見操作技巧與操作注意事項,需要的朋友可以參考下2019-10-10Python3實現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作示例
這篇文章主要介紹了Python3實現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作,涉及Python正則爬取數(shù)據(jù)及針對mysql數(shù)據(jù)庫的存儲操作相關實現(xiàn)技巧,需要的朋友可以參考下2018-06-06python中列表添加元素的幾種方式(+、append()、extend())
本文主要介紹了python中列表添加元素的幾種方式(+、append()、extend()),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08