一键净化Excel数据:高性能Python脚本实现多核并行清理

摘要

本文分享两个基于Python的Excel数据净化脚本,通过多进程并行技术清除工作表内不可见字符、批注、单元格样式等冗余内容,利用OpenPyXL实现底层操作,结合tqdm进度条和进程级任务分配,可快速处理百万级单元格数据。适用于数据分析预处理、跨系统数据迁移等场景。

脚本一:并行处理统一(单)进度条版本

架构设计:

主进程
初始化进程池
分配工作表任务
进程1处理整表
进程2处理整表
单元格清洗流水线
清除不可见字符
移除批注
重置样式
保存临时文件
合并处理结果

源码:

import openpyxl
from openpyxl.styles import NamedStyle, Font, Border, PatternFill
from openpyxl.formatting import Rule
import re
from tqdm import tqdm
import multiprocessing
from functools import partialdef clean_invisible_chars(text):"""清除字符串中的不可见字符"""if not isinstance(text, str):return textreturn re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)def process_cell(cell, no_style, no_fill, cleared_list):"""处理单个单元格的并行化函数"""# 清除单元格所有样式cell.fill = no_fillcell.font = Font(name='Calibri', size=11, bold=False, italic=False)cell.border = Border()cell.number_format = 'General'# 清除不可见字符if cell.value and isinstance(cell.value, str):cell.value = clean_invisible_chars(cell.value)cleared_list.append('不可见字符')# 清除批注if cell.comment:cell.comment = Nonecleared_list.append('批注')# 清除样式cell.style = no_stylecleared_list.append('单元格样式')def process_sheet(args):"""处理整个工作表的并行化函数"""input_file, output_file, sheet_name = argscleared_items = set()# 每个进程独立处理一个完整的工作表wb = openpyxl.load_workbook(input_file)ws = wb[sheet_name]no_style = NamedStyle(name="Normal")no_fill = PatternFill(fill_type=None)# 清除所有条件格式ws.conditional_formatting = []cleared_items.add('条件格式填充色')total_rows = ws.max_rowtotal_cols = ws.max_column# 使用tqdm显示进度for row in tqdm(ws.iter_rows(), total=total_rows, desc=f"处理 {sheet_name}"):for cell in row:# 清除单元格所有样式cell.fill = no_fillcleared_items.add('背景填充色')cell.font = Font(name='Calibri', size=11, bold=False, italic=False)cell.border = Border()cell.number_format = 'General'cell.style = no_stylecleared_items.add('单元格样式')# 清除不可见字符if cell.value and isinstance(cell.value, str):cell.value = clean_invisible_chars(cell.value)cleared_items.add('不可见字符')# 清除批注if cell.comment:cell.comment = Nonecleared_items.add('批注')# 保存临时文件temp_file = f"temp_{sheet_name}.xlsx"wb.save(temp_file)return (temp_file, sheet_name, list(cleared_items))def clear_all_and_save(input_file, output_file, sheet_name, num_processes=None):"""多进程并行清除工作表中的:1. 不可见字符2. 批注3. 单元格样式"""if num_processes is None:num_processes = multiprocessing.cpu_count()print(f"使用 {num_processes} 个进程并行处理...")# 准备参数 (这里可以扩展为处理多个sheet)args = [(input_file, output_file, sheet_name)]# 创建进程池with multiprocessing.Pool(processes=num_processes) as pool:results = list(tqdm(pool.imap(process_sheet, args), total=len(args), desc="总进度"))# 合并处理结果cleared_items = set()for temp_file, sheet_name, items in results:cleared_items.update(items)# 这里可以添加合并多个临时文件的逻辑# 保存最终工作簿 (简化处理,直接使用第一个结果)import shutilshutil.move(results[0][0], output_file)cleared_text = "\n".join(f"  ✔ 清除-{item}" for item in cleared_items)print("已完成:\n"+cleared_text+f"\n并保存到 {output_file}")if __name__ == '__main__':input_excel_file = '测试文件.xlsx' # 原始文件output_excel_file = '清除样式_测试文件_并行版.xlsx' # 生成文件sheet_to_clean = 'sheet1' # sheet nameprint(f"输入文件: {input_excel_file}")print(f"输出文件: {output_excel_file}")print(f"目标工作表: {sheet_to_clean}")try:clear_all_and_save(input_excel_file, output_excel_file, sheet_to_clean)except Exception as e:print(f"处理过程中发生错误: {str(e)}")

脚本二:多核独立进度条版本

架构设计:

主进度条
启动N个Worker进程
进程0进度条
进程1进度条
单元格样式处理器
字符过滤器
批注清除器
生成校验日志
多文件聚合器
最终输出文件

源码:

import openpyxl
from openpyxl.styles import NamedStyle, Font, Border, PatternFill
from openpyxl.formatting import Rule
import re
from tqdm import tqdm
import multiprocessing
from functools import partialdef clean_invisible_chars(text):"""清除字符串中的不可见字符"""if not isinstance(text, str):return textreturn re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)def process_sheet(args):"""处理整个工作表的并行化函数"""input_file, output_file, sheet_name, process_idx = argscleared_items = set()# 每个进程独立处理一个完整的工作表wb = openpyxl.load_workbook(input_file)ws = wb[sheet_name]no_style = NamedStyle(name="Normal")no_fill = PatternFill(fill_type=None)# 清除所有条件格式ws.conditional_formatting = []cleared_items.add('条件格式填充色')total_rows = ws.max_rowtotal_cols = ws.max_column# 使用多行进度条(position参数控制行位置)process_idx = args[3]  # 获取进程索引for row in tqdm(ws.iter_rows(), total=total_rows, desc=f"进程{process_idx}", position=process_idx+1):for cell in row:# 清除单元格所有样式cell.fill = no_fillcell.font = Font(name='Calibri', size=11, bold=False, italic=False)cell.border = Border()cell.number_format = 'General'cell.style = no_stylecleared_items.update(['背景填充色', '单元格样式'])# 清除不可见字符if cell.value and isinstance(cell.value, str):cell.value = clean_invisible_chars(cell.value)cleared_items.add('不可见字符')# 清除批注if cell.comment:cell.comment = Nonecleared_items.add('批注')# 保存临时文件temp_file = f"temp_{sheet_name}.xlsx"wb.save(temp_file)return (temp_file, sheet_name, list(cleared_items))def clear_all_and_save(input_file, output_file, sheet_name, num_processes=None):"""多进程并行清除工作表中的:1. 不可见字符2. 批注3. 单元格样式"""if num_processes is None:num_processes = multiprocessing.cpu_count()print(f"使用 {num_processes} 个进程并行处理...")# 准备参数并添加进程索引args = [(input_file, output_file, sheet_name, i) for i in range(num_processes)]# 确保至少有一个参数组if not args:args = [(input_file, output_file, sheet_name, 0)]# 创建进程池并显示总进度with multiprocessing.Pool(processes=num_processes) as pool:# 在主进度条下方显示各进程进度with tqdm(total=len(args), desc="总进度", position=0) as pbar:results = []for result in pool.imap(process_sheet, args):results.append(result)pbar.update()# 合并处理结果cleared_items = set()for temp_file, sheet_name, items in results:cleared_items.update(items)# 这里可以添加合并多个临时文件的逻辑# 保存最终工作簿 (简化处理,直接使用第一个结果)import shutilshutil.move(results[0][0], output_file)cleared_text = "\n".join(f"  ✔ 清除-{item}" for item in cleared_items)print("已完成:\n"+cleared_text+f"\n并保存到 {output_file}")if __name__ == '__main__':input_excel_file = '测试文件.xlsx' # 原始文件output_excel_file = '清除样式_测试文件_并行版.xlsx' # 生成文件sheet_to_clean = 'sheet1' # sheet nameprint(f"输入文件: {input_excel_file}")print(f"输出文件: {output_excel_file}")print(f"目标工作表: {sheet_to_clean}")try:clear_all_and_save(input_excel_file, output_excel_file, sheet_to_clean)except Exception as e:print(f"处理过程中发生错误: {str(e)}")

核心清除能力

  • 数据净化:过滤ASCII 0-31不可见控制字符
  • 元数据清理:彻底清除单元格批注内容
  • 样式重置
    • 移除条件格式规则
    • 重置字体为Calibri 11pt
    • 清除所有填充颜色
    • 移除单元格边框样式
  • 性能优化
    • 多进程负载均衡
    • 基于CPU核心数自动扩展
    • 无锁内存独立操作

适用场景

  1. 第三方系统导出的脏数据清洗
  2. 金融数据脱敏后标准化处理
  3. 跨平台迁移Excel文件前的格式转换
  4. 机器学习数据预处理阶段
  5. 定期自动化报表生成前的重置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Netty】EventLoopGroup

在Netty的ServerBootstrap中设置两个EventLoopGroup的作用是将网络操作的两个关键阶段分离到不同的线程组中处理,从而优化性能并简化并发控制。具体来说: 1. 两个EventLoopGroup的角色 第一个EventLoopGroup(通常称为bossGroup)&…

【前端】Vue中使用CKeditor作为富文本编辑器

官网https://ckeditor.com/ 此处记录一下我在使用的时候具体初始化的代码。 <template><div><textarea :id"id"></textarea></div> </template><script> export default {name: CkEditor,data: function () {return {id:…

前端面经 websocket

应用层协议&#xff0c;实现一个TCP连接上的全双工通信&#xff0c;实时通讯 之前的实时WEB 实现轮询 增加轮询频率 ws wss 明文版本 和 密文版本 特点 # 1 头部小 2 更注重实时性

【笔记】suna部署之获取 Supabase API key 和 project URL

#工作记录 Supabase | The Open Source Firebase Alternative 一、注册与登录 方式一&#xff1a;GitHub 授权登录 在登录页面选择 “继续使用 GitHub” &#xff0c;跳转到 GitHub 授权页面&#xff08;如图 5 所示&#xff09;。确认 “Supabase 的想要访问您的 [账户名] 帐…

爬虫工具链的详细分类解析

以下是针对爬虫工具链的详细分类解析&#xff0c;涵盖静态页面、动态渲染和框架开发三大场景的技术选型与核心特性&#xff1a; &#x1f9e9; 一、静态页面抓取&#xff08;HTML结构固定&#xff09; 工具组合&#xff1a;Requests BeautifulSoup 适用场景&#xff1a;目标数…

STM32F407寄存器操作(ADC非连续扫描模式)

1.前言 书接上回&#xff0c;在看手册的时候我突然发现手册上还描述了另一种ADC扫描模式&#xff0c;即非连续扫描模式&#xff0c;想着连续扫描模式都已经探索过了&#xff0c;那就顺手把非非连续模式研究一下吧。 2.理论 我们先看看手册&#xff0c;这里我就以规则通道举例…

spring切面

概念 两个特点&#xff1a; IOC控制反转AOP主要用来处理公共的代码 例如一个案例就是添加用户&#xff0c;重复的代码包含了记录日志、事务提交和事务回滚等&#xff0c;都是重复的&#xff0c;为了简单&#xff0c;交给AOP来做。 即将复杂的需求分解出不同方面&#xff0c…

[Python] Python中的多重继承

文章目录 Lora中的例子 Lora中的例子 https://github.com/michaelnny/QLoRA-LLM/blob/main/qlora_llm/models/lora.py#L211C1-L243C10如果继承两个父类&#xff0c;并且父类的__init__参数不一样&#xff0c;则可以显式的调用父类init&#xff1b;如果用super().__init__()则需…

rsync服务的搭建

目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项&#xff1a; 3. rsyncinotify实时同步 3.依赖服务托管xinetd&#xff08;CentOS 6中rs…

【C/C++】面试基础题目收集

C 软件开发面试中常见的刷题题目通常可分为以下几大类&#xff1a;数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 &#x1f9e0; 一、数据结构与算法&#xff08;力扣/牛客经典题&#xff09; 掌握 STL 和底层结构实现能力&#xff1a; &#x1f4cc; 数…

将手机网络经USB数据线和本地局域网共享给华为AP6050DN无线接入点

引言 由于最近装毕的新家所在的小区未能及时通宽带,于是家中各类无线设备如何上网就成了首要要解决的问题。 鉴于家中要联网的设备多、类型杂、支持频段也不一,总是开手机热点不是回事儿,于是就想着把手机网络引至华为AP6050DN无线接入点中,让家中所有的无线设备都能快速高…

【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​

深度优先搜索 导读&#xff1a;从广度到深度&#xff0c;探索图的遍历奥秘一、深度优先搜索二、算法思路三、算法逻辑四、算法评价五、深度优先生成树六、有向图与无向图结语&#xff1a;深潜与回溯&#xff0c;揭开图论世界的另一面 导读&#xff1a;从广度到深度&#xff0c;…

Flink CEP实践总结:使用方法、常见报错、优化与难点应对

Flink CEP实践总结&#xff1a;使用方法、常见报错、优化与难点应对 随着实时数据分析需求的提升&#xff0c;Flink CEP&#xff08;Complex Event Processing&#xff0c;复杂事件处理&#xff09;成为事件流检测中的利器。本文结合实际项目经验&#xff0c;总结Flink CEP的基…

Python数据类型详解:从字符串到布尔值,一网打尽

Python是现代编程语言中非常流行的一种&#xff0c;它的语法简洁、易懂&#xff0c;非常适合初学者。而在Python编程中&#xff0c;“数据类型”是最基础也是最重要的概念。理解这个概念&#xff0c;将为你之后的编程打下坚实的基础。 1. 什么是数据类型&#xff1f; 在Pytho…

python打卡day42

Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度&#xff0c;但标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;很难直接访问中间层的信息。PyT…

中国风展示工作总结商务通用PPT模版

中国风展示工作总结商务通用PPT模版&#xff1a;中国风商务通用PPT 模版https://pan.quark.cn/s/42ad18c010d4

TeleAI发布TeleChat2.5及T1正式版,双双开源上线魔乐社区!

5月12日&#xff0c;中国电信开源TeleChat系列四个模型&#xff0c;涵盖复杂推理和通用问答的多个尺寸模型&#xff0c;包括TeleChat-T1-35B、TeleChat-T1-115B、TeleChat2.5-35B和TeleChat2.5-115B&#xff0c;实测模型性能均有显著的性能效果。TeleChat系列模型基于昇思MindS…

机器视觉2D定位引导一般步骤

机器视觉的2D定位引导是工业自动化中的核心应用,主要用于精确确定目标物体的位置(X, Y坐标)和角度(旋转角度θ),并引导机器人或运动机构进行抓取、装配、对位、检测等操作。其一般步骤可概括如下: 一、系统规划与硬件选型 明确需求: 定位精度要求(多少毫米/像素,多少…

儿童节快乐,聊聊数字的规律和同余原理

某年的6月1日是星期日。那么&#xff0c;同一年的6月30日是星期几&#xff1f; 星期是7天一个循环。所以说&#xff0c;这一天是星期几&#xff0c;7天之后同样也是星期几。而6月30日是在6月1日的29天之后&#xff1a;29 7 4 ... 1用29除以7&#xff0c;可以得出余数为1。而…

最佳实践|互联网行业软件供应链安全建设的SCA纵深实践方案

在数字化转型的浪潮中&#xff0c;开源组件已成为企业构建云服务与应用的基石&#xff0c;但其引入的安全风险也日益凸显。某互联网大厂的核心安全研究团队&#xff0c;通过深度应用软件成分分析&#xff08;SCA&#xff09;技术&#xff0c;构建了一套覆盖开源组件全生命周期管…