# 从文件名提取成绩表-改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语句中,这样可以确保文件在使用完毕后被正确关闭。其他调整主要是为了提高代码的可读性和一致性。

image
image

posted @   nxhujiee  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示