python基础课的期末作业,
留个记录,主要是比普通的多了用pandas和openpyxl两个库,从excel导出和导入功能放到append部分:
效果:
正题
分7个部分,因为我是新手方便编写,结构如下:
append.py
import pandas as pd
import openpyxl
menu_append = '''
------学生信息管理系统------
1. 增加单个学生信息
2. 从excel导入学生信息
3. 导出学生信息到excel
0. 返回上级菜单
---------------------------
'''
def add_student(db):
id = input("请输入学号:").strip()
name = input("请输入姓名:").strip()
class_name = input("请输入班级:").strip()
# 检查学号是否重复
for student in db:
if student['id'] == id:
print("学号已存在,请使用其他学号。")
return
# 添加学生信息到数据库
new_student = {
'id': id,
'name': name,
'class_name': class_name # 确保使用合适的键名
}
db.append(new_student)
print("学生信息添加成功!")
def export_students_to_excel(db):
file_path = input("请输入要保存的Excel文件路径(包括文件名和后缀,如output.xlsx):").strip()
# 将数据库转换为DataFrame
df = pd.DataFrame(db)
try:
# 将DataFrame写入Excel文件
df.to_excel(file_path, index=False)
print("学生信息导出成功!")
except Exception as e:
print(f"导出Excel文件时发生错误:{e}")
def import_students_from_excel(db):
file_path = input("请输入Excel文件路径:").strip()
try:
# 读取Excel文件
data = pd.read_excel(file_path)
# 遍历每一行,将学生信息添加到数据库
for index, row in data.iterrows():
id = row['学号'] # 假设Excel中有“学号”这一列
name = row['姓名'] # 假设Excel中有“姓名”这一列
class_name = row['班级'] # 假设Excel中有“班级”这一列
# 检查学号是否重复
if any(student['id'] == id for student in db):
print(f"学号 {id} 已存在,跳过该学生。")
continue
# 添加学生信息到数据库
new_student = {
'id': id,
'name': name,
'class_name': class_name
}
db.append(new_student)
print("学生信息从Excel导入成功!")
except Exception as e:
print(f"导入Excel文件时发生错误:{e}")
def db_append(db):
new_db = db
while True:
print(menu_append)
choice = input("请输入选项:")
if choice == "1":
add_student(new_db)
continue
elif choice == "2":
import_students_from_excel(new_db)
continue
elif choice == "3":
export_students_to_excel(new_db)
continue
elif choice == "0":
break
else:
print("输入错误,请重新输入!")
return new_db
delete.py
from display import search_by_id
menu_delete = '''
--------学生信息管理系统--------
1. 删除单个学生信息
2. 批量删除学生信息
3. 条件删除学生信息
0. 返回上级菜单
--------------------------------
'''
def delete_by_id(db, id):
for i in db:
if i['id'] == id:
db.remove(i)
return db
def db_delete(db):
new_db = db
while True:
print(menu_delete)
choice = input("请输入选项:")
if choice == '1':
id = input("请输入要删除的学生ID:")
if search_by_id(db, id) is None:
print("未找到输入的ID")
new_db = delete_by_id(new_db, id)
print("删除成功!")
continue
elif choice == '2':
ids = input("请输入要删除的学生ID,多个ID用空格分隔:")
ids = ids.split()
for id in ids:
if search_by_id(db, id) is None:
print(f"未找到输入的ID: {id}")
new_db = delete_by_id(new_db, id)
print("批量删除成功!")
continue
elif choice == '3':
print("条件删除功能暂未实现!")
continue
elif choice == '0':
break
else:
print("输入错误,请重新输入!")
return new_db
modify.py
from display import search_by_id
menu_modify = '''
--------学生信息管理系统---------
1. 修改学生信息
2. 批量修改学生信息
0. 返回上级菜单
--------------------------------
'''
def update_record(db, record):
new_db = db
old_record = search_by_id(db, record['id']) # 找到原记录
new_db.remove(old_record) # 从原记录中删除
new_db.append(record) # 添加新记录
return new_db # 返回更新后的数据库
def db_modify(db):
new_db = db
while True:
print(menu_modify)
choice = input("请输入选项:")
if choice == '1':
id = input("请输入学生ID:")
record = search_by_id(db, id)
if len(record) != 0:
print("找到记录:可修改")
print(record)
else:
print("未找到记录!")
name = input("请输入学生姓名:")
calss_name = input("请输入班级名称:")
record['name'] = name
record['class_name'] = calss_name
new_db = update_record(new_db, record)
print("修改后的记录:")
print(record)
continue
elif choice == '2':
print("批量修改功能暂未开放!")
continue
elif choice == '0':
break
else:
print("输入错误,请重新输入!")
return new_db
display.py
menu_display = '''
1 全部学生信息
2 按学号查询
3 按姓名查询
4 其他条件查询
0. 返回上一级菜单
'''
# 通过id查询学生信息
def search_by_id(db, id):
for i in db:
if i['id'] == id:
return i # 返回包含找到的记录的列表
else:
return [] # 如果没有找到,返回一个空列表
# 通过姓名查询学生信息
def search_by_name(db, name):
for i in db:
if i['name'] == name:
return [i] # 返回包含找到的记录的列表
else:
return [] # 如果没有找到,返回一个空列表
# 显示所有结果
def show_all(db):
if db is None:
print("学生数据库未初始化!")
return
total = len(db)
print(f"共有{total}条记录")
for i in range(total): # 遍历索引
student = db[i] # 获取学生字典
student_id = student.get('id', '未知') # 使用 get() 防止 KeyError
student_name = student.get('name', '未知')
student_class = student.get('class_name', '未知')
print(f"学号:{student_id} 姓名:{student_name} 班级:{student_class}")
def show_result(records):
if type(records) == list:
total = len(records)
else:
total = 1
print(f"共有{total}条记录")
for student in range(total): # 遍历索引
if type(records) == list:
student = records[student] # 获取学生字典
else:
student = records # 获取学生字典
student_id = student.get('id', '未知') # 使用 get() 防止 KeyError
student_name = student.get('name', '未知')
student_class = student.get('class_name', '未知')
print(f"学号:{student_id} 姓名:{student_name} 班级:{student_class}")
def db_display(db):
while True:
print(menu_display)
choice = input("请输入选项:")
if choice == '1':
show_all(db)
continue
elif choice == '2':
id = input("请输入学号:")
records = search_by_id(db, id)
# 如果返回空列表,说明没有找到相关记录
if records == []:
print("没有查询到相关记录")
else:
show_result(records)
elif choice == '3':
name = input("请输入姓名:")
records = search_by_name(db, name)
# 如果返回空列表,说明没有找到相关记录
if records == []:
print("没有查询到相关记录")
else:
show_result(records)
elif choice == '4':
print("暂不支持其他条件查询")
continue
elif choice == '0':
break
else:
print("输入错误,请重新输入")
count.py
def db_count(db):
print('暂时不支持统计功能')
db.py
import pickle as p
def loaddb(db_file):
db = list()
try:
with open(db_file, 'rb') as f:
db = p.load(f)
except FileNotFoundError:
print('数据库文件不存在!')
return db
def dumpdb(db, db_file):
try:
with open(db_file, 'wb') as f:
p.dump(db, f)
except:
print('数据库保存失败!')
if __name__ == '__main__':
file_name = 'data.dat'
data = [{'name': '张三', 'age': 20, 'gender': '男'}, {'name': '李四', 'age': 21, 'gender': '女'},{None}]
with open(file_name, 'wb') as f:
p.dump(data, f)
with open(file_name, 'rb') as f:
data = p.load(f)
print(data)
print('load success!')
student.py
from pathlib import Path # 导入pathlib模块,用来处理文件路径
from db import loaddb, dumpdb # 导入数据库操作函数
from display import db_display # 导入数据库显示函数
from append import db_append # 导入数据库追加函数
from delete import db_delete # 导入数据库删除函数
from modify import db_modify # 导入数据库修改函数
from count import db_count # 导入数据库统计函数
menu = '''
---------------学生信息管理系统---------------
1. 显示学生信息
2. 增加学生信息
3. 删除学生信息
4. 修改学生信息
5. 统计
0. 退出
---------------------------------------------
'''
db_file = 'student.dat'
if Path(db_file).exists():
student_db = loaddb(db_file)
else:
student_db = [
{'id': '001', 'name': '张三', 'class_name': '一班'},
{'id': '002', 'name': '李四', 'class_name': '二班'}
]
dumpdb(student_db, db_file)
print('数据库文件不存在,已自动创建!')
while True:
print(menu)
choice = int(input('请输入选项:'))
if choice in [1, 2, 3, 4, 5, 0]:
pass
else:
print('输入错误,请重新输入!')
continue
if choice == 1:
db_display(student_db)
continue
elif choice == 2:
student_db = db_append(student_db)
continue
elif choice == 3:
student_db = db_delete(student_db)
continue
elif choice == 4:
student_db = db_modify(student_db)
continue
elif choice == 5:
db_count(student_db)
continue
elif choice == 0:
dumpdb(student_db, db_file)
print('退出完成!')
break