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

news2025/6/6 21:42:17

摘要

本文分享两个基于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 partial

def clean_invisible_chars(text):
    """清除字符串中的不可见字符"""
    if not isinstance(text, str):
        return text
    return re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)

def process_cell(cell, no_style, no_fill, cleared_list):
    """处理单个单元格的并行化函数"""
    # 清除单元格所有样式
    cell.fill = no_fill
    cell.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 = None
        cleared_list.append('批注')
        
    # 清除样式
    cell.style = no_style
    cleared_list.append('单元格样式')

def process_sheet(args):
    """处理整个工作表的并行化函数"""
    input_file, output_file, sheet_name = args
    cleared_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_row
    total_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_fill
            cleared_items.add('背景填充色')
            cell.font = Font(name='Calibri', size=11, bold=False, italic=False)
            cell.border = Border()
            cell.number_format = 'General'
            cell.style = no_style
            cleared_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 = None
                cleared_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 shutil
    shutil.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 name
    
    print(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 partial

def clean_invisible_chars(text):
    """清除字符串中的不可见字符"""
    if not isinstance(text, str):
        return text
    return re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)

def process_sheet(args):
    """处理整个工作表的并行化函数"""
    input_file, output_file, sheet_name, process_idx = args
    cleared_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_row
    total_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_fill
            cell.font = Font(name='Calibri', size=11, bold=False, italic=False)
            cell.border = Border()
            cell.number_format = 'General'
            cell.style = no_style
            cleared_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 = None
                cleared_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 shutil
    shutil.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 name
    
    print(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.coloradmin.cn/o/2402146.html

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

相关文章

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)? 众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目:1731. 每位经理的下属员工数量 题解: select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…

资产智慧管理安全监测中心

在数字经济高速发展的今天,资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群,从交通枢纽到城市电网,资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑,构建起资产全生命周期的“智慧大…

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

目录 方法一: 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了, 生成的jar在这个目录下 3.右击,点击“复制路径/引用”,即可获得“绝对路径”、“根路径”等相关信息 前提: 在pop.…

【物联网-TCP/IP】

物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■

Halcon光度立体法

1、光度立体法,可用于将对象的三维形状与其二维纹理(例如打印图像)分离。需要用不同方向而且已知照明方向的多个光源,拍摄同一物体的至少三张图像。请注意,所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…

cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能

在使用oops框架的过程中,它的导出数据并生成数据结构的插件oops-plugin-excel-to-json有些小的坑点,为满足我个人习惯,对此部分进行了一个小的修改,有需要的拿去用,记录下供大家参考; 一、配置:…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时,结果会有不同吗?2.MySQL 中的内连接(INNER JOIN)和外连接(OUTER JOIN)有什么主要的区别?3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…

Kubernetes (k8s)版本发布情况

Kubernetes (k8s)版本发布情况 代码放在 GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management https://github.com/kubernetes/kubernetes/releases 文档放在 kubernetes.io各个版本变更等: https://github.com/kubernetes/kubernet…

QT 5.9.2+VTK8.0实现等高线绘制

项目下载链接:QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下: 主要代码如下: #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…

兼容老设备!EtherNet/IP转DeviceNet网关解决储能产线通讯难题

在新能源行业飞速发展的当下,工业自动化水平的高低直接影响着企业的生产效率与产品质量。JH-EIP-DVN疆鸿智能ETHERNET/IP和DEVICENET作为工业领域常用的通信协议,它们之间的转换应用在新能源生产线上发挥着关键作用。本文重点探讨ETHERNETIP从站转DEVICE…

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台,通过整合 NI数据采集设备、菲尼克斯(Phoenix Contact)继电器模块及罗技(Logitech)高清摄像头,实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题:YOLOv3: An Incremental Improvement 作者:Joseph Redmon, Ali Farhadi 机构:华盛顿大学(University of Washington) 发表时间:2018年 代…

算法篇 八大排序(冒泡 插入 选择 堆 希尔 快排 归并 计数)

目录 引言 1.冒泡排序 思路 代码实现 2.选择排序 思路 代码实现(存在易错点) 3.插入排序 思路 代码实现 4.希尔排序 思路 代码实现 5.堆排序 思路 代码实现 6.快速排序(快排) 一.三路划分 思路 代码实现 二.自…

音视频之视频压缩编码的基本原理

系列文章: 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 一、预测编码: 1、预测编码的基本概念: 预测法是最简单、实用的视频压缩编码方法,经过压缩编码后传输的并不是像素本身的取样值&#xff0…

IDEA 包分层显示设置

方法一(用的IntelliJ IDEA 2024.1.4版本): 找到项目视图设置入口:在左侧Project(项目)面板的顶部,有个三个点...的按钮 ,点击它。 进入树形外观配置:在弹出的菜单中&…

深度学习和神经网络 卷积神经网络CNN

1.什么是卷积神经网络 一种前馈神经网络;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点:通过卷积操作自动提取空间局部特征(如纹理、边缘),显著降低参数量 2.CNN的三个结构特征 局部连接&a…

PlayWright | 初识微软出品的 WEB 应用自动化测试框架

Playwright是微软大厂背书的跨平台 WEB 应用自动化测试框架,支持多开发语言(TypeScript、JavaScript、.Net、Python、Java)及多浏览器(Chromium、WebKit、Firefox),同时支持移动端测试。 安装 playwright …

Mac电脑_钥匙串操作选项变灰的情况下如何删除?

Mac电脑_钥匙串操作选项变灰的情况下如何删除? 这时候 可以使用相关的终端命令进行操作。 下面附加文章《Mac电脑_钥匙串操作的终端命令》。 《Mac电脑_钥匙串操作的终端命令》 (来源:百度~百度AI 发布时间:2025-06)…