# 从文件名提取成绩表-改2
您提供的代码已经很接近标准格式了,但我会对其进行一些小的调整以提高可读性和一致性。这包括添加一些空行来分隔不同的功能块,确保所有代码块都有适当的缩进,并对注释进行了一些微调。以下是按照标准格式重新输出的代码:
# 从文件名提取成绩表-改2
import os
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
def extract_student_data(folder_path):
"""
从指定文件夹中提取学生数据。
:param folder_path: 文件夹路径
:return: 学生数据列表
"""
student_list = []
for filename in os.listdir(folder_path):
if filename.endswith(".png") or filename.endswith(".PNG"):
try:
base_name = os.path.splitext(filename)[0]
machine_number, rest = base_name.split('-', 1)
name, score_str = rest.rsplit(' ', 1)
score = int(score_str)
student_list.append({"姓名": name, "成绩": score})
except (ValueError, IndexError):
continue
return student_list
def save_to_excel(data, output_path):
"""
将学生数据保存到Excel文件中。
:param data: 学生数据列表
:param output_path: 输出文件路径
"""
df = pd.DataFrame(data).sort_values(by='成绩', ascending=False)
df.insert(0, '序号', range(1, len(df) + 1))
title_row = pd.DataFrame([['成绩表'] + ['' for _ in range(len(df.columns) - 1)]], columns=df.columns)
df_with_title = pd.concat([title_row, pd.DataFrame([df.columns.tolist()], columns=df.columns), df], ignore_index=True)
with pd.ExcelWriter(output_path, engine='xlsxwriter') as writer:
df_with_title.to_excel(writer, index=False, sheet_name='Sheet1', header=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
border_format = workbook.add_format({'border': 1})
center_format = workbook.add_format({'border': 1, 'align': 'center'})
for row in range(len(df_with_title)):
for col in range(len(df_with_title.columns)):
value = df_with_title.iat[row, col] if row < len(df_with_title) else ''
cell_format = center_format if row >= 2 else border_format
worksheet.write(row, col, value, cell_format)
def on_select_folder():
"""选择包含学生作业文件的文件夹"""
folder_selected = filedialog.askdirectory()
if folder_selected:
entry_folder_path.delete(0, tk.END)
entry_folder_path.insert(0, folder_selected)
def on_select_output_file():
"""选择保存学生成绩Excel文件的路径"""
output_file_path = filedialog.asksaveasfilename(defaultextension=".xlsx", filetypes=[("Excel files", "*.xlsx")])
if output_file_path:
entry_output_path.delete(0, tk.END)
entry_output_path.insert(0, output_file_path)
def on_extract_click():
"""提取学生成绩并保存到指定文件"""
folder_path = entry_folder_path.get()
output_path = entry_output_path.get()
if not folder_path or not output_path:
messagebox.showerror("输入错误", "请确保已选择文件夹和输出文件路径。")
return
if not os.path.isdir(folder_path):
messagebox.showerror("输入错误", "选择的路径不是一个有效的文件夹。")
return
student_data = extract_student_data(folder_path)
if not student_data:
messagebox.showwarning("无数据", "在选定文件夹中没有找到符合格式的文件。")
return
save_to_excel(student_data, output_path)
messagebox.showinfo("成功", f"学生成绩已保存到 {output_path}")
# 创建GUI界面
root = tk.Tk()
root.title("学生成绩提取器")
label_folder_path = tk.Label(root, text="请选择包含学生作业文件的文件夹:")
label_folder_path.grid(row=0, column=0, padx=10, pady=10)
entry_folder_path = tk.Entry(root, width=50)
entry_folder_path.grid(row=0, column=1, padx=10, pady=10)
button_select_folder = tk.Button(root, text="浏览", command=on_select_folder)
button_select_folder.grid(row=0, column=2, padx=10, pady=10)
label_output_path = tk.Label(root, text="请输入要保存的学生成绩Excel文件路径:")
label_output_path.grid(row=1, column=0, padx=10, pady=10)
entry_output_path = tk.Entry(root, width=50)
entry_output_path.grid(row=1, column=1, padx=10, pady=10)
button_select_output_file = tk.Button(root, text="浏览", command=on_select_output_file)
button_select_output_file.grid(row=1, column=2, padx=10, pady=10)
button_extract = tk.Button(root, text="提取学生成绩", command=on_extract_click)
button_extract.grid(row=2, column=0, columnspan=3, pady=20)
# 运行主循环
root.mainloop()
在这个版本中,我添加了函数文档字符串(docstrings)来描述每个函数的作用,这有助于其他开发者理解代码的功能。同时,我也调整了pd.ExcelWriter
的使用方式,将其放在了一个with
语句中,这样可以确保文件在使用完毕后被正确关闭。其他调整主要是为了提高代码的可读性和一致性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)