#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
高校学科评估助手 - 交互式命令行程序
支持多种查询功能,输出JSON格式结果
"""
import sys
import os
from university_assistant import UniversityRankingsAssistant
import json
def print_menu():
"""打印菜单"""
print("\n" + "="*70)
print(" 高校学科评估助手 - 功能菜单")
print("="*70)
print("【查询功能】")
print(" 1. 高校专业搜索 - 输入高校名,查看其所有学科及评估等级")
print(" 2. 学科信息查询 - 输入学科名,查看开设该学科的所有高校及排名")
print(" 3. 等级筛选查询 - 按评估等级(A+/A/A-等)筛选查看学科点")
print(" 4. 地区浏览 - 按省份查看该地区高校的学科分布")
print(" 5. 高校排行榜 - 按学科数量、A+数量等多维度排序")
print(" 6. 学科排行榜 - 显示每个学科的开设高校数、A+数量统计")
print(" 7. 强势学科分析 - 查看某高校或地区的A/A+学科")
print(" 8. 评估等级分析 - 统计各等级的学科点分布、热门学科")
print(" 16. 生成报告 - 导出查询结果为JSON文件")
print(" 0. 退出程序")
print("="*70)
def handle_search_university(assistant):
"""处理高校搜索"""
print("\n【功能1】高校专业搜索")
university = input("请输入高校名称(支持模糊匹配): ").strip()
if not university:
print("❌ 高校名称不能为空")
return
result = assistant.search_university(university)
print("\n📊 查询结果:")
print(result)
# 询问是否导出
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_university_{university}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_search_discipline(assistant):
"""处理学科查询"""
print("\n【功能2】学科信息查询")
discipline = input("请输入学科名称(支持模糊匹配): ").strip()
if not discipline:
print("❌ 学科名称不能为空")
return
result = assistant.search_discipline(discipline)
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_discipline_{discipline}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_filter_by_grade(assistant):
"""处理等级筛选"""
print("\n【功能3】等级筛选查询")
print("可选等级: A+, A, A-, B+, B, B-, C+, C, C-")
grades_input = input("请输入要查询的等级(用逗号分隔): ").strip()
if not grades_input:
print("❌ 等级不能为空")
return
grades = [g.strip() for g in grades_input.split(',')]
result = assistant.filter_by_grade(grades)
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_grades_{'_'.join(grades)}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_browse_province(assistant):
"""处理地区浏览"""
print("\n【功能4】地区浏览")
province = input("请输入省份名称: ").strip()
if not province:
print("❌ 省份不能为空")
return
result = assistant.browse_by_province(province)
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_province_{province}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_university_ranking(assistant):
"""处理高校排行"""
print("\n【功能5】高校排行榜")
print("排序方式:")
print(" 1. disciplines - 按学科总数")
print(" 2. a_plus - 按A+学科数")
print(" 3. a_grade - 按A级及以上学科数")
print(" 4. first_class - 按一流大学学科数")
choice = input("请选择排序方式 (输入选项数字或方式名称): ").strip().lower()
rank_map = {
'1': 'disciplines', '2': 'a_plus', '3': 'a_grade', '4': 'first_class',
'disciplines': 'disciplines', 'a_plus': 'a_plus', 'a_grade': 'a_grade', 'first_class': 'first_class'
}
rank_by = rank_map.get(choice, 'disciplines')
result = assistant.university_ranking(rank_by)
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_university_ranking_{rank_by}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_discipline_ranking(assistant):
"""处理学科排行"""
print("\n【功能6】学科排行榜")
print("排序方式:")
print(" 1. universities - 按开设高校数")
print(" 2. a_plus - 按A+数量")
print(" 3. a_grade - 按A级及以上数量")
choice = input("请选择排序方式 (输入选项数字或方式名称): ").strip().lower()
rank_map = {
'1': 'universities', '2': 'a_plus', '3': 'a_grade',
'universities': 'universities', 'a_plus': 'a_plus', 'a_grade': 'a_grade'
}
rank_by = rank_map.get(choice, 'universities')
result = assistant.discipline_ranking(rank_by)
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = f"result_discipline_ranking_{rank_by}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_strong_disciplines(assistant):
"""处理强势学科分析"""
print("\n【功能7】强势学科分析")
print("查询方式:")
print(" 1. 按高校查询")
print(" 2. 按地区查询")
choice = input("请选择查询方式 (1 或 2): ").strip()
if choice == '1':
university = input("请输入高校名称: ").strip()
if not university:
print("❌ 高校名称不能为空")
return
result = assistant.strong_disciplines(university=university)
elif choice == '2':
province = input("请输入省份名称: ").strip()
if not province:
print("❌ 省份不能为空")
return
result = assistant.strong_disciplines(province=province)
else:
print("❌ 无效的选择")
return
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
if choice == '1':
filename = f"result_strong_disciplines_{university}.json"
else:
filename = f"result_strong_disciplines_{province}.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_grade_analysis(assistant):
"""处理等级分析"""
print("\n【功能8】评估等级分析")
result = assistant.grade_analysis()
print("\n📊 查询结果:")
print(result)
export = input("\n是否导出为JSON文件?(y/n): ").strip().lower()
if export == 'y':
filename = "result_grade_analysis.json"
assistant.export_to_json_file(result, filename)
print(f"✅ 已导出到: {filename}")
def handle_export_report(assistant):
"""处理报告生成"""
print("\n【功能16】生成报告")
print("首先需要执行一个查询功能获得数据,然后导出为JSON文件")
print("\n请选择之前已执行的查询编号,或输入已保存的JSON数据文件路径")
data_input = input("请输入: ").strip()
if data_input.endswith('.json'):
# 从文件读取
try:
with open(data_input, 'r', encoding='utf-8') as f:
content = f.read()
filename = input("请输入新的报告文件名 (默认为 report.json): ").strip() or "report.json"
assistant.export_to_json_file(content, filename)
print(f"✅ 已导出到: {filename}")
except FileNotFoundError:
print("❌ 文件不存在")
else:
print("❌ 请输入有效的JSON文件路径")
def main():
"""主程序"""
print("\n🎓 欢迎使用高校学科评估助手")
print(" 基于第四轮学科评估结果")
# 初始化助手
excel_file = "第四轮学科评估结果.xlsx"
if not os.path.exists(excel_file):
print(f"❌ 错误: 找不到文件 '{excel_file}'")
print(" 请确保数据文件在当前目录中")
return
print(f"📁 正在加载数据文件: {excel_file}")
try:
assistant = UniversityRankingsAssistant(excel_file)
print("✅ 数据加载成功")
print(f" 共加载 {len(assistant.df)} 条记录")
print(f" 涵盖 {assistant.df['一级学科'].nunique()} 个一级学科")
print(f" 涵盖 {assistant.df['院校名称'].nunique()} 所高校")
except Exception as e:
print(f"❌ 加载数据失败: {str(e)}")
return
# 主循环
while True:
print_menu()
choice = input("请选择功能 (0-8 或 16): ").strip()
if choice == '0':
print("\n👋 感谢使用高校学科评估助手,再见!")
break
elif choice == '1':
handle_search_university(assistant)
elif choice == '2':
handle_search_discipline(assistant)
elif choice == '3':
handle_filter_by_grade(assistant)
elif choice == '4':
handle_browse_province(assistant)
elif choice == '5':
handle_university_ranking(assistant)
elif choice == '6':
handle_discipline_ranking(assistant)
elif choice == '7':
handle_strong_disciplines(assistant)
elif choice == '8':
handle_grade_analysis(assistant)
elif choice == '16':
handle_export_report(assistant)
else:
print("❌ 无效的选择,请重试")
if __name__ == "__main__":
main()