一、基本概述
1.專案背景
隨著大資料時代的發展,大資料抓取了人們最想要的資訊,資料查詢能幫助用戶獲取更有用的資訊,讓每個人都能享受到大資料帶給生活的高效和便捷,
2.設計目的
為了大大縮減人們出行選擇站點所需時間,為了讓人們在陌生地區,在對當地交通不熟的情況下,能有效獲取交通站點地址和聯系方式等,所以設計了車站資訊管理系統,該系統可以方便人們查詢某地區車站、火車站、機場和輪渡相關資訊,
3.主要作業
設計了簡單版的一個車站資訊管理系統,使用Python語言開發,先對需求與設計進行分析,然后開始開發專案,即對具體功能代碼的實作,主要資料存盤,資料格式化,檔案操作與管理等技術,最后對功能實作進行在不同情況下多次測驗,
解釋:面向物件程式設計(Object Oriented Programming)作為一種新方法,其本質是以建立模型體現出來的抽象思維程序和面向物件的方法,
二、需求分析
1.引入庫
主要實作車站相關資訊的增、刪、改、查等功能
主要用到的模塊是正則運算式模塊re和作業系統模塊os

2.功能清單
a. 錄入車站相關資訊:
1)輸入車站資訊,包括車站名稱,所屬地區,聯系電話,具體地址,行政區劃代碼,
輸入格式正確則按行保存資料到檔案中,
2)如果輸入格式錯誤,則拋出例外,捕獲例外,列印’輸入無效’,
3)輸入錯誤可重新輸入,輸入正確可以繼續添加,也可以結束程式,
b. 查找車站相關資訊:
1)選擇查找的方式,輸入查找資訊,
2)找到則顯示查詢結果,沒找到則列印’無相關資訊’,
c. 洗掉車站相關資訊:
1)當車站資訊為空時,列印’車站資訊還未錄入’,當車站資訊不為空時,可輸入正確 車站名稱可洗掉對應資料,
2)如果輸入車站名稱錯誤,則列印’沒有找到該名稱的車站資訊’,
d. 修改車站相關資訊:
1)先顯示全部車站資訊,輸入要修改的車站名稱 ,
2)輸入車站存在且輸入格式正確即可修改資料,輸入錯誤,則不修改任何資料,
e. 對車站資訊進行排序:
1)先顯示全部車站資訊,選擇升序或降序排序,
2)選擇排序方式即可對資訊進行重新排序,
f. 統計車站的總數量:
1)輸入對應的選單項,可列印出車站的總數量,方便統計,
g. 顯示所有車站資訊:
1)輸入對應選單項,顯示全部資訊,方便用戶查找需要的內容,
h. 退出系統:
1)輸入對應選單項,可結束行程,退出系統,
程式設計
函式設計
主函式:
def main():
ctrl = True # 標記是否退出系統
while ctrl:
menu() # 顯示選單
option = input("請選擇選單項:") # 選擇選單項
option_str = re.sub(r"\D", "", option) # 把非數字替換掉,提取數字
if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
option_int = int(option_str)
if option_int == 0: # 退出系統
print('您已退出車站資訊管理系統!')
ctrl = False
elif option_int == 1: # 錄入車站相關資訊
insert()
elif option_int == 2: # 查找車站相關資訊
search()
elif option_int == 3: # 洗掉車站相關資訊
delete()
elif option_int == 4: # 修改車站相關資訊
modify()
elif option_int == 5: # 對車站資訊進行排序
sort()
elif option_int == 6: # 統計車站的總數量
total()
elif option_int == 7: # 顯示所有車站資訊
show()
else:
print("你輸入的數字不在功能選單(0 ~ 7)范圍內!")
資料存盤設計
1)先建立一個空串列,把錄入的資料保存到一個字典中,再把字典添加到這個空串列中,
2)利用for回圈從串列中把每一個字典提出來,以追加模式寫入檔案,添加換行符,按行存盤,
3)如果檔案不存在用寫入模式,創建并打開檔案,然后再進行2)中的操作,
開發
撰寫代碼
這部分為7個部分,對應7個主要的功能函式,每個函式對應一種功能,
功能函式1:錄入
# 1 錄入車站相關資訊
def insert():
station_list = [] # 保存車站資訊的串列,保存字典到這個串列
mark = True # 是否繼續添加
while mark:
sta_name = input("請輸入車站名稱:")
if not sta_name: # 名稱為空,跳出回圈
break
sta_area = input("請輸入地區(如 鯉城區/縣):")
if not sta_area: # 地區為空,跳出回圈
break
sta_address = input("請輸入車站具體地址:")
if not sta_address: # 地址為空,跳出回圈
break
try:
sta_division_code = int(input("請輸入車站對應縣(區)行政區劃代碼:"))
sta_telephone = int(input("請輸入聯系電話:"))
except ValueError:
print("輸入無效,輸入的不是整型數值....重新錄入資訊")
continue # 重新錄入
# 將輸入的車站資訊保存到字典
station = {"車站名稱": sta_name, "所屬地區": sta_area, "聯系電話": sta_telephone,
"具體地址": sta_address, "行政區劃代碼": sta_division_code}
station_list.append(station) # 將車站字典添加到車站串列中
input_mark = input("是否繼續添加?(yes/no):")
if input_mark == "yes": # 繼續添加
mark = True
else: # 不繼續添加
mark = False
save(station_list) # 將學生資訊保存到檔案
print("車站資訊錄入完畢!!!")
功能函式2:查找
# 2 查找車站資訊
def search():
station_query = [] # 保存查詢結果的車站串列
mark = True
while mark:
sta_area = ""
sta_name = ""
sta_division_code = ""
if os.path.exists(file_name): # 判斷檔案是否存在,存在則回傳True
mode = input("按所屬地區查輸入1;按車站名稱查輸入2:")
if mode == "1":
sta_area = input("請輸入車站所屬地區:")
elif mode == "2":
sta_name = input("請輸入車站名稱:")
else:
print("您的輸入有誤,請重新輸入!")
search() # 重新查詢
with open(file_name, 'r') as file: # 打開檔案
read_sta = file.readlines() # 讀取全部內容
for info in read_sta:
d = dict(eval(info)) # 字串轉字典d
if sta_area != "": # 判斷是否按所屬地區查
if d['所屬地區'] == sta_area:
station_query.append(d) # 將找到的車站資訊保存到串列中
elif sta_name != "": # 判斷是否按車站名稱查
if d['車站名稱'] == sta_name:
station_query.append(d)
elif sta_division_code != "":
if d['行政區劃代碼'] == sta_division_code:
station_query.append(d)
show_station(station_query) # 顯示查詢結果
station_query.clear() # 清空串列
input_mark = input("是否繼續查詢?(yes/no):")
if input_mark == "yes":
mark = True
else:
mark = False
else:
print("暫未保存資料資訊...")
return # 如果return后面有引數,那么就是回傳值;如果沒有引數,就表示結束程式,
功能函式3:洗掉
# 3 洗掉車站資訊
def delete():
mark = True # 標記是否回圈
while mark:
sta_name = input("請輸入要洗掉的車站名稱:")
if sta_name != "": # 判斷要洗掉的車站是否存在,非空即Ture
if os.path.exists(file_name): # 判斷檔案是否存在
with open(file_name, 'r') as r_file: # 打開檔案
station_old = r_file.readlines() # 讀取全部內容
# station_old是一個包含全部資訊的串列,是從file_name中讀出來的
else:
station_old = []
ifdel = False # 標記是否洗掉
if station_old: # 如果存在車站資訊非空則往下走
with open(file_name, 'w') as f: # 以寫方式打開檔案
for info in station_old:
d = dict(eval(info)) # 字串轉字典
if d['車站名稱'] != sta_name: # 某一條資訊(字典)車站名稱為你輸入的
f.write(str(d) + "\n") # 將一條車站資訊寫入檔案
else:
ifdel = True # 標記已經洗掉
if ifdel:
print("車站名稱為 %s 的車站資訊已經被洗掉..." % sta_name)
else:
print("沒有找到車站名稱為 %s 的車站資訊..." % sta_name)
else: # 不存在車站資訊
print("車站資訊還未錄入,無車站相關資訊...")
break # 退出回圈
show() # 顯示全部車站資訊
input_mark = input("是否繼續洗掉?(yes/no):")
if input_mark == "yes":
mark = True # 繼續洗掉
else:
mark = False # 退出洗掉車站資訊功能
功能函式4:修改
# 4 修改車站資訊
def modify():
show() # 顯示全部車站資訊
if os.path.exists(file_name): # 判斷檔案是否存在
with open(file_name, 'r') as r_file: # 打開檔案
station_old = r_file.readlines() # 讀取全部內容
else:
return
sta_name = input("請輸入要修改的車站名稱:")
with open(file_name, "w") as w_file: # 以寫模式打開檔案
for info in station_old:
d = dict(eval(info)) # 字串轉字典
if d["車站名稱"] == sta_name: # 是否為要修改的車站
print("找到了這個車站,可以修改該車站資訊!")
while True: # 輸入要修改的資訊
try:
d["車站名稱"] = input("請輸入車站名稱:")
d["所屬地區"] = input("請輸入車站地區:")
d["聯系電話"] = int(input("請輸入聯系電話:"))
d["具體地址"] = input("請輸入具體地址:")
d["行政區劃代碼"] = int(input("請輸入行政縣區劃代碼:"))
except ValueError:
print("您的輸入有誤,請重新輸入,")
else:
break # 跳出回圈
info = str(d) # 將字典轉換為字串
w_file.write(info + "\n") # 將修改的資訊寫入到檔案
print("修改成功!")
else:
w_file.write(info) # 將未修改的資訊寫入到檔案
mark = input("是否繼續修改其他車站資訊?(yes/no):")
if mark == "yes":
modify() # 重新執行修改操作
else:
print("退出修改!")
功能函式5:排序
# 5 排序
def sort():
show() # 顯示全部車站資訊
if os.path.exists(file_name): # 判斷檔案是否存在
with open(file_name, 'r') as file: # 打開檔案
station_old = file.readlines() # 讀取全部內容
station_new = []
for info in station_old:
d = dict(eval(info)) # 字串轉字典
station_new.append(d) # 將轉換后的字典添加到串列中
else:
return
sign = input("請選擇(0升序;1降序):")
if sign == "0": # 按升序排序
sequence = False # 標記變數,為False表示升序排序
elif sign == "1": # 按降序排序
sequence = True # 標記變數,為True表示降序排序
else:
print("您的輸入有誤,請重新輸入!")
sort()
mode = input("請選擇排序方式 (1按行政區劃代碼排序;2按聯系電話排序) :")
if mode == "1": # 按行政區劃代碼排序
station_new.sort(key=lambda x: x["行政區劃代碼"], reverse=sequence)
elif mode == "2": # 按聯系電話排序
station_new.sort(key=lambda x: x["聯系電話"], reverse=sequence)
else:
print("您的輸入有誤,請重新輸入!")
sort()
show_station(station_new) # 顯示排序結果
功能函式6:總計
# 6 統計車站總數量
def total():
if os.path.exists(file_name): # 判斷檔案是否存在
with open(file_name, 'r') as r_file: # 打開檔案
station_old = r_file.readlines() # 讀取全部內容
if station_old:
print("一共有 %d 個車站!" % len(station_old))
else:
print("還沒有錄入車站資訊!")
else:
print("暫未保存資料資訊...")
功能函式7:顯示全部
# 7 顯示所有車站資訊
def show():
station_new = []
if os.path.exists(file_name): # 判斷檔案是否存在
with open(file_name, 'r') as rfile: # 打開檔案
station_old = rfile.readlines() # 讀取全部內容
for info in station_old:
station_new.append(eval(info)) # 將找到的車站資訊保存到串列中
if station_new:
show_station(station_new)
else:
print("暫未保存資料資訊...")
# 將保存在串列中的車站資訊顯示出來
def show_station(station_list):
if not station_list:
print("(o@.@o) 很抱歉,無相關資料資訊! (o@.@o) \n")
return
format_title = "{:^12}{:^12}\t{:^8}\t{:^27}\t{:^12}"
print(format_title.format("車站名稱", "地區", "聯系電話", "具體地址", "行政區劃代碼"))
format_data = "{:^12}{:^10}\t{:^12}\t{:^25}\t{:^8}"
for info in station_list:
print(format_data.format(str(info.get("車站名稱")), str(info.get("所屬地區")), str(info.get("聯系電話")),
str(info.get("具體地址")), str(info.get("行政區劃代碼"))))
檔案操作與管理
# 將車站資訊保存到檔案
def save(sta_list):
try:
with open(file_name, "a") as f1: # 以追加模式打開
for info in sta_list:
f1.write(str(info) + "\n") # 串列中的字典按行存盤,添加換行符
except OSError:
f2 = open(file_name, "w") # 檔案不存在,創建檔案并打開
for info in sta_list:
f2.write(str(info) + "\n") # 按行存盤,添加換行符
f2.close()
實體測驗
提示:隨便輸入幾個例子,主要用于對程式的測驗,
完成專案開發階段,進入測驗環節, 首先在test.py這個模塊分開對各個函式進行測驗,然后對整個代碼進行測驗和單次除錯,對多種不同的情況精選測驗,基本能完成對應功能,
以下是對一些典型情況的測驗結果圖:


總結
簡單總結一下
通過這次專案,同學們對檔案操作與管理就應該有了更好的掌握,更加了解程式設計的程序,雖然基本功能都能實作,但是程式還有許多不足的地方,了解到寫程式應該先完成主體的搭建,再完成主要功能的開發,最終才是增加程式健壯性,完善功能實作和提高用戶體驗感的設計,
在這次的學習程序中,體會到了:
- 查閱資料是學習必不可少的部分,要學會善于查找資料,虛心向其它程式員學習,
- 要建立自信心,相信自己能寫好一個完整的程式,
- 要善于除錯,從中發現錯誤,要多次測驗,發現例外,處理例外增強程式的健壯性,
原始碼下載:
https://download.csdn.net/download/Big_Data_Kai/20674907
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291426.html
標籤:其他
