机械工程控制基础期末复习指南:从传递函数到劳斯判据的考点与实战
2026/9/7 21:46:18
【办公类-112-04】20260415街道学生名单基本信息模版(运用deepseek的Python编程,实现excle数据匹配提取)https://mp.csdn.net/mp_blog/creation/editor/160192625
''' 20260905江川托幼信息收集《XX园--2026学年学生名单》 1、下载园园通新生名册.xls。 2、把“大班一班”改成“大1班 deepseek,阿夏 20260917 ''' import pandas as pd import os import re date='20260825' def merge_and_format_excel(): # 定义文件路径 path = r'D:\Python最终内容\20260903托育名单' # 设置路径 folder_path = path + r"\00 园园通下载" output_path = path + r'\02 园园通全部班级班信息合并.xlsx' # 获取文件夹中的所有Excel文件 excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xlsx', '.xls'))] # if len(excel_files) < 2: # print("234文件夹中Excel文件数量不足2个") # return # 读取所有Excel文件 dfs = [] for file in excel_files[:3]: # 只处理前两个文件 file_path = os.path.join(folder_path, file) df = pd.read_excel(file_path) dfs.append(df) print(f"已读取文件: {file}") # 合并数据 merged_df = pd.concat(dfs, ignore_index=True) # 将列名"ID"改为"市登记编号"(如果存在) if 'ID' in merged_df.columns: merged_df.rename(columns={'ID': '市登记编号'}, inplace=True) print("已将列名'ID'改为'市登记编号'") else: print("未找到名为'ID'的列,跳过重命名") # 格式化班级列(统一改为"托1班"、"小1班"、"中1班"、"大1班"格式) def format_class_name(class_name): if pd.isna(class_name): return class_name class_str = str(class_name) # 定义班级类型映射 class_type_map = { '托': '托', '托大': '托', '小': '小', '中': '中', '大': '大' } # 中文数字到阿拉伯数字的映射 chinese_to_arabic = { '一': '1', '二': '2', '三': '3', '四': '4', '五': '5', '六': '6', '七': '7', '八': '8', '九': '9', '十': '10', '十一': '11', '十二': '12' } # 先提取班级类型 class_type = None class_num = None # 匹配各种格式 # 1. 匹配"托大X班"、"小X班"、"中X班"、"大X班"格式 match = re.search(r'(托大|小|中|大)([一二三四五六七八九十\d]+)班', class_str) if match: class_type = match.group(1) class_num = match.group(2) else: # 2. 匹配"大一班"、"托一班"格式 match = re.search(r'(托|小|中|大)([一二三四五六七八九十])班', class_str) if match: class_type = match.group(1) class_num = match.group(2) else: # 3. 匹配"大班一班"格式 match = re.search(r'(托大|小|中|大)班([一二三四五六七八九十]+)班', class_str) if match: class_type = match.group(1) class_num = match.group(2) else: # 4. 匹配"一班大班"格式 match = re.search(r'([一二三四五六七八九十]+)班(托大|小|中|大)班', class_str) if match: class_num = match.group(1) class_type = match.group(2) else: # 5. 匹配只有班级类型没有班号的情况 match = re.search(r'(托大|小|中|大)班', class_str) if match: class_type = match.group(1) class_num = '1' # 默认班号为1 else: # 6. 匹配只有班级类型没有"班"字的情况 match = re.search(r'(托大|小|中|大)', class_str) if match: class_type = match.group(1) class_num = '1' # 默认班号为1 if class_type: # 标准化班级类型 if class_type == '托大': std_type = '托' else: std_type = class_type # 转换班号 if class_num: if class_num in chinese_to_arabic: num = chinese_to_arabic[class_num] else: num = class_num return f"{std_type}{num}班" # 如果没有匹配到任何模式,尝试直接提取数字 # 检查是否已经是"托1班"这样的格式 match = re.match(r'([托小中大])(\d+)班', class_str) if match: return class_str # 已经是正确格式 # 最后尝试:如果字符串中包含"托"、"小"、"中"、"大",且包含数字 for t in ['托', '小', '中', '大']: if t in class_str: # 提取所有数字 nums = re.findall(r'\d+', class_str) if nums: return f"{t}{nums[0]}班" # 如果还是无法处理,返回原值 print(f"警告:无法识别的班级格式 - {class_str}") return class_str # 查找包含班级信息的列 class_columns = [col for col in merged_df.columns if any(keyword in col for keyword in ['班', 'class', '班级'])] if class_columns: for class_col in class_columns: print(f"检测到班级列: {class_col}") merged_df[class_col] = merged_df[class_col].apply(format_class_name) else: print("未检测到班级列,跳过格式转换") # 保存合并后的文件 merged_df.to_excel(output_path, index=False) print(f"文件已保存至: {output_path}") print(f"合并完成,共{len(merged_df)}条记录") # 显示一些样本数据以供验证 print("\n前10条数据的班级信息:") if class_columns: for class_col in class_columns: print(f"\n{class_col}列的前10个值:") sample_values = merged_df[class_col].head(10).tolist() for i, val in enumerate(sample_values, 1): print(f" {i}. {val}") else: print("未找到班级列") # 显示所有列名 print("\n合并后的所有列名:") print(merged_df.columns.tolist()) # 执行函数 if __name__ == "__main__": merge_and_format_excel()''' 20260905江川托幼信息收集《XX园--2026学年学生名单》 1.匹配学号 2.读取相应列的内容,更改格式。写入一个Excel内 3.提示复制方法(原表有序列,需要写的内容一模一样) 豆包,阿夏 20260917 ''' # -*- coding: utf-8 -*- import pandas as pd import os import re from openpyxl.utils import get_column_letter from openpyxl.styles import Alignment path = r'D:\Python最终内容\20260903托育名单' date = '20260903' target_columns = [ '序号', '姓名', '性别', '年级', '班级', '证件类型', '证件号码', '出生日期', '民族', '户籍类别', '籍贯', '住址', '联系电话', '学生类型', '学号' ] # -------------------------- # 1. 年级映射:指定顺序 托班→小班→中班→大班 # -------------------------- grade_map = { "托班": 1, "小班": 2, "中班": 3, "大班": 4 } def calculate_display_width(text): if text is None or (isinstance(text, float) and pd.isna(text)): return 0 text = str(text) width = 0 for char in text: if '\u4e00' <= char <= '\u9fff' or char in ',。;:“”‘’!?【】()《》': width +=2 else: width +=1 return width def judge_hukou(province, district): p = str(province) if pd.notna(province) else '' d = str(district) if pd.notna(district) else '' if '上海' in p: return '本区' if '闵行' in d else '本市外区' else: return '外省' def format_date(value): if value is None or (isinstance(value, float) and pd.isna(value)): return '' try: dt = pd.to_datetime(value) return f"{dt.year}/{dt.month}/{dt.day}" except Exception: return str(value) def get_student_type(grade): if grade in ("托班", "小班"): return "新入学" elif grade in ("中班", "大班"): return "其他" return "" def auto_width(worksheet): for column in worksheet.columns: max_width = 0 col_letter = get_column_letter(column[0].column) for cell in column: try: w = calculate_display_width(cell.value) max_width = max(max_width,w) except Exception: pass worksheet.column_dimensions[col_letter].width = min(max(max_width+2,8),100) def set_text_format(worksheet): for row in worksheet.iter_rows(): for cell in row: cell.number_format = '@' cell.alignment = Alignment(vertical='center', wrap_text=False) def build_output_df(df): result = pd.DataFrame() result['姓名'] = df['姓名'] result['性别'] = df['性别'] result['年级'] = df['_grade_text'] result['班级'] = df['_class_no'].astype(str) result['证件类型'] = df['证件类型'] result['证件号码'] = df['证件号码'] result['出生日期'] = df['出生日期'].apply(format_date) result['民族'] = df['民族'] result['户籍类别'] = df.apply(lambda r: judge_hukou(r['户口所在地-省份'], r['户口所在地-区县']), axis=1) result['籍贯'] = df['籍贯-省份'] result['住址'] = df['现居地-详细地址'] result['联系电话'] = df['监护人手机'] result['学生类型'] = result['年级'].apply(get_student_type) result['学号'] = df['学号'] return result # ===================== 读取&合并数据 ===================== df_main = pd.read_excel(path + r'\02 园园通全部班级班信息合并.xlsx', dtype=str) xls = pd.ExcelFile(path + r'\01 20260805班级信息表.xlsx') df_list = [] for sheet in xls.sheet_names: df_sheet = pd.read_excel(xls, sheet_name=sheet, dtype=str) df_sheet['班级'] = sheet df_list.append(df_sheet) df_info = pd.concat(df_list, ignore_index=True) df_merged = pd.merge(df_main, df_info[['班级', '姓名', '学号']], left_on=['班级名称','姓名'], right_on=['班级','姓名'], how='left') # -------------------------- # 从原始班级名称拆分出年级文字、班号数字 # -------------------------- def split_grade_class(raw): s = str(raw).strip().replace('\u3000','') m = re.match(r'([托小中大])(\d+)班', s) if m: g_txt = {"托":"托班","小":"小班","中":"中班","大":"大班"}[m.group(1)] c_num = int(m.group(2)) return g_txt, c_num return "", 999 res = df_merged['班级名称'].apply(split_grade_class) df_merged['_grade_text'] = [x[0] for x in res] df_merged['_class_no'] = [x[1] for x in res] # -------------------------- # 构建排序字段(核心!) # 1.年级编码:托班1,小班2,中班3,大班4 # 2.班号数字 # 3.学号数字;空学号填9999放在本班末尾 # -------------------------- df_merged['sort_grade'] = df_merged['_grade_text'].map(grade_map).fillna(99) df_merged['sort_class'] = df_merged['_class_no'] df_merged['sort_stuid'] = pd.to_numeric(df_merged['学号'], errors='coerce').fillna(9999) # 三层排序:年级编码 → 班号 → 学号 df_sorted = df_merged.sort_values( by=["sort_grade", "sort_class", "sort_stuid"], ascending=[True, True, True] ).reset_index(drop=True) # 生成输出表,再补序号 output_df = build_output_df(df_sorted) output_df.insert(0, "序号", range(1, len(output_df)+1)) output_df = output_df[target_columns] # -------------------------- # 打印调试前30行,看排序字段 # -------------------------- print("====调试【年级编码|年级|班号|学号排序值|原始学号】====") dbg = df_sorted[["sort_grade","_grade_text","sort_class","sort_stuid","学号"]].head(30) print(dbg.to_string()) # 输出Excel out_path = os.path.join(path, f'03_最终排序_年级班级学号升序.xlsx') sheet_name = f'全园名单'[:31] with pd.ExcelWriter(out_path, engine='openpyxl') as writer: output_df.to_excel(writer, sheet_name=sheet_name, index=False) ws = writer.sheets[sheet_name] auto_width(ws) set_text_format(ws) print(f"\n✅输出完成:{out_path}") print("排序规则:托班→小班→中班→大班;同年级班号升序;同班学号数字升序")