运行Python代码处理CSV成绩生成HTML表格不显示问题求助
原有代码存在的问题
- 变量使用错误:遍历学生数据时把迭代变量
i错写为数字1,导致学生数据完全存错;遍历学生字典时定义的键变量是v,后续却用未定义的x取值,运行会直接报错。 - 数据转换逻辑错误:分数转换的列表推导式写为
[int(a)for b in tests],变量a未定义,无法完成转换。 - HTML语法错误:表格border属性用了中文引号,浏览器无法识别边框样式;仅写了第一个表格的表头,没有填充统计数据、学生成绩表内容,也没有闭合表格、body、html标签,页面渲染异常。
- 文件操作错误:
html.close没加括号,实际未完成文件写入保存,页面是空的;重复调用csvFile.close()属于冗余操作。 - 功能逻辑缺失:没有计算5门科目各自的最低/最高/平均分的逻辑,没有生成学生成绩表的逻辑,也没有计算最高平均分学生的逻辑,完全没有覆盖需求。
修正后完整代码
首先确认你的CSV文件分隔符,如果是逗号分隔就将下面的delimiter改为',',如果是空格分隔改为' ',和实际文件匹配即可:
import csv import webbrowser # 读取CSV文件 csvFile = open('testdata (1).csv', encoding='utf-8') csvReader = csv.reader(csvFile, delimiter=",") # 分隔符需和实际CSV文件匹配 # 存储每门课的所有分数,以及每个学生的分数 test_scores = [[], [], [], [], []] student_scores = {} for row in csvReader: # 跳过空行 if not row: continue name = row[0] scores = list(map(int, row[1:6])) student_scores[name] = scores for idx in range(5): test_scores[idx].append(scores[idx]) csvFile.close() # 计算每门课的统计数据:最低分、最高分、平均分 test_stats = [] for ts in test_scores: min_s = min(ts) max_s = max(ts) avg_s = round(sum(ts)/len(ts), 2) test_stats.append([min_s, max_s, avg_s]) # 计算每个学生的统计数据:姓氏、名字、平均分、最低分、最高分 student_stats = [] for full_name, scores in student_scores.items(): first_name, last_name = full_name.split() s_min = min(scores) s_max = max(scores) s_avg = round(sum(scores)/len(scores), 2) student_stats.append([last_name, first_name, s_avg, s_min, s_max]) # 找平均分最高的学生 top_student = max(student_stats, key=lambda x:x[2]) # 生成HTML html = open('lab3.html','w', encoding='utf-8') html_content = '''<html> <head> <meta charset="utf-8"> <title>成绩统计</title> </head> <body> <h1>科目成绩统计</h1> <table border="1"> <tr> <th>统计项</th> <th>Test 1</th> <th>Test 2</th> <th>Test 3</th> <th>Test 4</th> <th>Test 5</th> </tr> <tr> <td>最低分</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> </tr> <tr> <td>最高分</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> </tr> <tr> <td>平均分</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> </tr> </table> <h1>学生成绩统计</h1> <table border="1"> <tr> <th>姓氏</th> <th>名字</th> <th>平均分</th> <th>最低分</th> <th>最高分</th> </tr> '''.format( test_stats[0][0], test_stats[1][0], test_stats[2][0], test_stats[3][0], test_stats[4][0], test_stats[0][1], test_stats[1][1], test_stats[2][1], test_stats[3][1], test_stats[4][1], test_stats[0][2], test_stats[1][2], test_stats[2][2], test_stats[3][2], test_stats[4][2] ) # 填充学生数据 for s in student_stats: html_content += '<tr><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>\n'.format(s[0], s[1], s[2], s[3], s[4]) html_content += '</table>\n' # 添加最高平均分学生信息 html_content += '<h3>平均分最高的学生:{} {},平均分:{}</h3>\n'.format(top_student[1], top_student[0], top_student[2]) html_content += '</body></html>' html.write(html_content) html.close() webbrowser.open_new_tab('lab3.html')
内容的提问来源于stack exchange,提问作者user17230529
相关产品推荐
相关产品推荐

