测试data_management函数
这是我最近正在开发的AI工具信息平台的部门功能模块测试,基于streamlit架构。整理出来与大家分享,也为我以后自己回溯找到资源。
为了测试 data_management
函数并结合 Excel 文件中的 “Tools” 表单内容,我们需要进行以下步骤:
- 确保 Excel 文件准备好:你的 Excel 文件(例如
test_tools.xlsx
)应包含相关的工具数据。 - 实现
save_all_data
函数:确保有一个函数用于保存数据回 Excel 文件。 - 编写完整的测试代码:将
data_management
函数整合到一个 Streamlit 应用中,以便从 Excel 读取数据、执行管理操作并实时展示结果。
步骤 1:准备 Excel 文件
确保你的 Excel 文件 test_tools.xlsx
内容如下:
Name | Category | Country | Company | Description | URL | Open Source | Popularity | LastUpdated |
---|---|---|---|---|---|---|---|---|
通义千问 | 大语言模型 | 中国 | 阿里巴巴 | 阿里云企业级大模型平台 | https://tongyi.aliyun.com | 否 | 400 | 2024/2/11 |
智谱清言App | 大语言模型 | 中国 | 智谱AI | 新一代认知智能大模型,提供对话、问答等功能 | https://chatglm.cn/ | 否 | 5000 | 2025/1/22 |
Tool A | 大语言模型 | USA | Company A | A great tool | http://example.com | 是 | 100 | 2023/1/1 |
Tool B | 大语言模型 | Canada | Company B | Another great tool | http://example2.com | 否 | 200 | 2023/1/2 |
Tool C | 大语言模型 | UK | Company C | Amazing tool | http://example3.com | 是 | 150 | 2023/1/3 |
步骤 2:实现 save_all_data
函数
确保你能将数据保存回 Excel 文件。以下是一个简单的示例实现:
def save_all_data(excel_file, tools_data, tutorials_data):
"""保存所有数据到 Excel 文件"""
with pd.ExcelWriter(excel_file) as writer:
# 将工具数据写入工作表
for category, items in tools_data.items():
df = pd.DataFrame(items)
df.to_excel(writer, sheet_name=category, index=False)
# 如果有教程数据,也可以保存到对应的工作表
if tutorials_data: # 示例,如果有必要可以添加处理
tutorials_df = pd.DataFrame(tutorials_data)
tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)
return True
步骤 3:编写完整的 Streamlit 应用代码
将 data_management
函数整合到一个完整的 Streamlit 应用中,读取 Excel 文件并实现数据的管理功能:
import pandas as pd
import streamlit as st
import datetime
# 国家标志示例
COUNTRY_FLAGS = {
'中国': '🇨🇳',
'USA': '🇺🇸',
'Canada': '🇨🇦',
'UK': '🇬🇧'
}
def save_all_data(excel_file, tools_data, tutorials_data):
"""保存所有数据到Excel"""
try:
tools_rows = []
for category, items in tools_data.items():
for item in items:
tools_rows.append({
'Name': item['name'],
'Category': category,
'Country': item['country'],
'Company': item.get('company', ''),
'Description': item['description'],
'URL': item['url'],
'Open Source': item['open_source']
})
tools_df = pd.DataFrame(tools_rows)
tutorials_rows = []
for tool_name, tutorials in tutorials_data.items():
for tut in tutorials:
tutorials_rows.append({
'TutorialID': tut['id'],
'RelatedTool': tool_name,
'Title': tut['title'],
'URL': tut['url'],
'Type': tut['type'],
'DifficultyLevel': tut['difficulty'],
'Duration': tut.get('duration', ''),
'Rating': tut.get('rating', None),
'Language': tut.get('language', '中文'),
'Tags': ', '.join(tut.get('tags', [])),
'VersionCompatible': tut.get('version', ''),
'Author': tut.get('author', '')
})
tutorials_df = pd.DataFrame(tutorials_rows)
with pd.ExcelWriter(excel_file, engine='openpyxl') as writer:
tools_df.to_excel(writer, sheet_name='Tools', index=False)
tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)
return True
except Exception as e:
st.error(f"保存失败:{str(e)}")
return False
class EnhancedConfig:
SERPER_API_KEY = 'your api_key' # 替换为实际的 API 密钥
def render_url(url):
"""根据URL生成超链接"""
if url and url != '无':
return f'<a href="{url}" class="link-btn" target="_blank">{url}</a>'
else:
return "<span>无可用链接</span>"
def classify_tool(name, description):
"""模拟分类工具的功能"""
return '大语言模型' # 示例返回
def data_management(excel_file, tools_data):
# 新增分类验证功能
if st.sidebar.button("🔍 分类质量检查"):
error_count = 0
for category, items in tools_data.items():
for item in items:
predicted = classify_tool(item['name'], item['description'])
if predicted != category:
st.warning(f"分类不一致:{item['name']} 当前分类:{category},预测分类:{predicted}")
error_count += 1
st.info(f"完成检查,发现{error_count}个潜在分类问题")
# 数据管理界面
st.sidebar.subheader("数据管理")
operation = st.sidebar.radio("操作类型", ["添加条目", "编辑条目", "删除分类", "增加分类"])
if operation == "添加条目":
category = st.selectbox("选择分类", list(tools_data.keys()) + ["新增分类"])
if category == "新增分类":
category = st.text_input("请输入新分类名称")
with st.form("添加表单"):
name = st.text_input("工具名称")
url = st.text_input("官网URL")
country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()))
company = st.text_input("公司名称")
description = st.text_area("工具描述")
open_source = st.selectbox("是否开源", ["是", "否"])
popularity = st.slider("初始流行度", 500, 2000, 1000)
if st.form_submit_button("提交"):
if all([category, name, url]):
new_item = {
'name': name,
'url': url,
'description': description,
'country': country,
'open_source': open_source,
'company': company,
'popularity': popularity,
'last_updated': datetime.datetime.now()
}
if category not in tools_data:
tools_data[category] = []
tools_data[category].append(new_item)
if save_all_data(excel_file, tools_data, {}): # 假设没有教程数据
st.success("添加成功!")
else:
st.error("请填写必填字段(分类、名称、URL)")
elif operation == "编辑条目":
category = st.selectbox("选择分类", list(tools_data.keys()))
items = tools_data.get(category, [])
if items:
index = st.selectbox("选择条目", range(len(items)), format_func=lambda x: items[x]['name'])
with st.form("编辑表单"):
new_category = st.text_input("新分类名称", value=category)
name = st.text_input("工具名称", value=items[index]['name'])
url = st.text_input("官网URL", value=items[index]['url'])
# 确保安全地获取国家
try:
selected_country_index = list(COUNTRY_FLAGS.keys()).index(items[index]['country'])
except ValueError:
selected_country_index = 0 # 默认到第一个国家
country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()), index=selected_country_index)
company = st.text_input("公司名称", value=items[index]['company'])
description = st.text_area("工具描述", value=items[index]['description'])
open_source = st.selectbox("是否开源", ["是", "否"],
index=["是", "否"].index(items[index]['open_source']))
if st.form_submit_button("保存修改"):
del tools_data[category][index]
if new_category not in tools_data:
tools_data[new_category] = []
tools_data[new_category].append({
'name': name,
'url': url,
'description': description,
'country': country,
'open_source': open_source,
'company': company
})
if not tools_data[category]:
del tools_data[category]
if save_all_data(excel_file, tools_data, {}): # 假设没有教程数据
st.success("修改已保存!")
else:
st.warning("该分类下没有条目可供编辑或删除!")
elif operation == "增加分类":
new_category = st.text_input("请输入新分类名称")
if st.button("提交"):
if new_category:
if new_category not in tools_data:
tools_data[new_category] = []
save_all_data(excel_file, tools_data, {})
st.success(f"分类 '{new_category}' 已成功添加!")
else:
st.error("该分类已存在,请选择其他名称。")
else:
st.error("分类名称不能为空。")
elif operation == "删除分类":
category = st.selectbox("选择分类", list(tools_data.keys()))
if st.button("确认删除"):
del tools_data[category]
if save_all_data(excel_file, tools_data, {}): # 假设没有教程数据
st.success(f"分类 {category} 已删除!")
def main():
# 从 Excel 文件读取工具数据
excel_file = 'test.xlsx'
tools_data = {}
# 读取 Excel 文件内容
df = pd.read_excel(excel_file, sheet_name='Tools')
# 构建工具数据字典
for _, row in df.iterrows():
category = row['Category']
if category not in tools_data:
tools_data[category] = []
tools_data[category].append({
'name': row['Name'],
'url': row['URL'],
'description': row['Description'],
'country': row['Country'],
'open_source': row['Open Source'],
'company': row['Company'],
'popularity': row['Popularity'],
'last_updated': row['LastUpdated']
})
data_management(excel_file, tools_data)
if __name__ == "__main__":
main()
步骤 4:运行测试
将上述代码保存为 Python 文件,例如 data_management_app.py
,然后在命令行中运行以下命令:
streamlit run data_management_app.py
验证输出
当应用启动后,你应该能够通过侧边栏操作来:
- 进行分类质量检查
- 添加、编辑和删除条目
- 增加或删除分类
确保在每次操作后正确更新 Excel 文件,并在页面上显示相应的结果和消息。
注意事项
- Excel 文件路径:确保 Excel 文件路径正确或与脚本在同一目录下。
- 异常处理:在操作中添加异常处理以捕获错误。
- 数据有效性检查:确保用户输入的数据格式正确。
通过这些步骤,你应该能够测试 data_management
函数。如果有任何问题或进一步的要求,请随时告诉我!