一、基本概述
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:录入
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:查找
def search():
station_query = []
mark = True
while mark:
sta_area = ""
sta_name = ""
sta_division_code = ""
if os.path.exists(file_name):
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))
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
功能函数3:删除
def delete():
mark = True
while mark:
sta_name = input("请输入要删除的车站名称:")
if sta_name != "":
if os.path.exists(file_name):
with open(file_name, 'r') as r_file:
station_old = r_file.readlines()
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:修改
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:排序
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
elif sign == "1":
sequence = 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:总计
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:显示全部
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这个模块分开对各个函数进行测试,然后对整个代码进行测试和单次调试,对多种不同的情况精选测试,基本能完成对应功能。 以下是对一些典型情况的测试结果图:
总结
简单总结一下 通过这次项目,同学们对文件操作与管理就应该有了更好的掌握,更加了解程序设计的过程,虽然基本功能都能实现,但是程序还有许多不足的地方。了解到写程序应该先完成主体的搭建,再完成主要功能的开发,最终才是增加程序健壮性,完善功能实现和提高用户体验感的设计。 在这次的学习过程中,体会到了:
- 查阅资料是学习必不可少的部分,要学会善于查找资料,虚心向其它程序员学习。
- 要建立自信心,相信自己能写好一个完整的程序。
- 要善于调试,从中发现错误,要多次测试,发现异常,处理异常增强程序的健壮性。
|