Python文档处理之实现自动删除Word中带指定底纹颜色的内容

 更新时间:2026年02月28日 08:54:03   作者:够好了吗?  
这篇文章主要为大家介绍了一个Python脚本,可以用于自动删除 Word 文档中带有指定底纹颜色的解析内容,文中的示例代码讲解详细,有需要的小伙伴可以了解下

代码功能概述

该脚本用于自动删除 Word 文档中带有指定底纹颜色的解析内容(如【分析】、【详解】等),同时保留答案块(以【答案】开头的有底纹段落及其后续连续有底纹的答案内容)。文档中所有无底纹的段落(题目描述、选项等)以及答案块内的内容都会被原样保留,其余文档结构(表格、页眉页脚、样式)不受影响。

脚本支持两种输入模式:

  • 处理单个文件:输入一个 .docx 文件路径,输出一个处理后的文件。
  • 批量处理文件夹:输入一个文件夹路径,自动处理该文件夹下所有 .docx 文件,输出到指定文件夹。

文档内容示例

脚本代码 

import os
from docx import Document
from docx.oxml.ns import qn

# ====== 配置参数(请根据您的文档修改)======
TARGET_SHADING_COLOR = 'F2F2F2'  # 从检测脚本获得的底纹颜色
ANALYSIS_MARKERS = ['【分析】', '【详解】', '【点睛】', '【错因】', '【避错关键】']
ANSWER_MARKER = '【答案】'
DEBUG = True  # 打印详细处理信息

# Word命名空间(用于查找元素)
NSMAP = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}


def has_shading_color(element, color):
    """判断元素是否具有指定底纹颜色"""
    # 使用 findall 并传入命名空间
    shading_elements = element.findall('.//w:shd', namespaces=NSMAP)
    if shading_elements:
        fill = shading_elements[0].get(qn('w:fill'))
        if fill:
            fill_clean = fill.strip().upper().lstrip('#')
            color_clean = color.strip().upper().lstrip('#')
            return fill_clean == color_clean
    return False


def is_analysis_start(text):
    """是否以解析标记开头"""
    return any(text.startswith(marker) for marker in ANALYSIS_MARKERS)


def collect_all_shaded_paragraphs(doc):
    """
    收集文档中所有具有目标底纹颜色的段落(包括文本框内)。
    返回列表,每个元素为 (element, text, parent)
    """
    items = []
    # 普通段落
    for para in doc.paragraphs:
        element = para._element
        if has_shading_color(element, TARGET_SHADING_COLOR):
            items.append((element, para.text.strip(), element.getparent()))
    # 文本框段落
    for txbx in doc.element.findall('.//w:txbxContent', namespaces=NSMAP):
        for p in txbx.findall('.//w:p', namespaces=NSMAP):
            if has_shading_color(p, TARGET_SHADING_COLOR):
                # 提取文本
                texts = [t.text for t in p.findall('.//w:t', namespaces=NSMAP) if t.text]
                full_text = ''.join(texts).strip()
                items.append((p, full_text, p.getparent()))
    return items


def process_docx_inplace(input_path, output_path):
    """
    在原文档基础上直接删除解析段落,保存到 output_path。
    """
    doc = Document(input_path)
    # 收集所有有底纹的段落
    shaded_items = collect_all_shaded_paragraphs(doc)
    n = len(shaded_items)
    delete_flags = [False] * n
    debug_info = []

    i = 0
    while i < n:
        element, text, parent = shaded_items[i]
        if text.startswith(ANSWER_MARKER):
            # 答案开始,保留
            if DEBUG:
                debug_info.append(f"保留答案开始 {i}: {text[:50]}")
            i += 1
            # 保留后续连续的有底纹段落,直到遇到解析标记
            while i < n:
                next_element, next_text, _ = shaded_items[i]
                if is_analysis_start(next_text):
                    break
                if DEBUG:
                    debug_info.append(f"保留答案内容 {i}: {next_text[:50]}")
                i += 1
            continue
        elif is_analysis_start(text):
            # 解析标记,删除本段及其后连续的有底纹段落(直到下一个答案块或解析标记)
            if DEBUG:
                debug_info.append(f"删除解析开始 {i}: {text[:50]}")
            delete_flags[i] = True
            i += 1
            while i < n:
                next_element, next_text, _ = shaded_items[i]
                if next_text.startswith(ANSWER_MARKER) or is_analysis_start(next_text):
                    break
                if DEBUG:
                    debug_info.append(f"删除解析内容 {i}: {next_text[:50]}")
                delete_flags[i] = True
                i += 1
            continue
        else:
            # 有底纹但不是答案也不是解析,删除(通常不会出现)
            if DEBUG:
                debug_info.append(f"删除其他有底纹段落 {i}: {text[:50]}")
            delete_flags[i] = True
            i += 1

    # 从后往前删除标记的段落元素
    for idx in range(n - 1, -1, -1):
        if delete_flags[idx]:
            element, _, parent = shaded_items[idx]
            parent.remove(element)

    # 保存文档
    doc.save(output_path)

    if DEBUG:
        print(f"处理文件: {os.path.basename(input_path)}")
        print(f"共处理有底纹段落 {n} 个,删除 {sum(delete_flags)} 个")
        print("=== 调试信息 ===")
        for info in debug_info[-20:]:  # 只打印最后20条,避免过长
            print(info)
        print("=== 处理完成 ===\n")


def process_file_or_folder(input_path, output_path):
    """
    自动判断输入是文件还是文件夹:
    - 如果是文件,处理该文件
    - 如果是文件夹,处理文件夹下所有 .docx 文件
    """
    if os.path.isfile(input_path):
        # 单个文件
        if not input_path.endswith('.docx'):
            print("请提供 .docx 文件")
            return
        if os.path.isdir(output_path):
            base = os.path.basename(input_path).replace('.docx', '_已处理.docx')
            output_file = os.path.join(output_path, base)
        else:
            output_file = output_path
        process_docx_inplace(input_path, output_file)
        print(f'处理完成:{os.path.basename(input_path)} -> {output_file}')
    elif os.path.isdir(input_path):
        # 文件夹
        if not os.path.exists(output_path):
            os.makedirs(output_path)
        for filename in os.listdir(input_path):
            if filename.endswith('.docx'):
                full_input = os.path.join(input_path, filename)
                full_output = os.path.join(output_path, filename.replace('.docx', '_已处理.docx'))
                process_docx_inplace(full_input, full_output)
                print(f'处理完成:{filename}')
    else:
        print("输入路径不存在")


if __name__ == '__main__':
    # ===== 使用示例 =====
    # 1. 处理单个文件,输出到指定路径
    input_path = r'C:\Desktop\读书笔记\讲义'
    output_path = r'C:\Desktop\读书笔记\讲义'
    process_file_or_folder(input_path, output_path)

到此这篇关于Python文档处理之实现自动删除Word中带指定底纹颜色的内容的文章就介绍到这了,更多相关Python Word文档处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现数据库与Excel文件之间的数据自动化导入与导出

    Python实现数据库与Excel文件之间的数据自动化导入与导出

    数据库和Excel文件是两种常见且重要的数据存储方式,本文将介绍如何使用Python有效地实现数据库与Excel文件之间的数据自动化导入与导出,以SQLite数据库为例,需要的朋友可以参考下
    2024-06-06
  • Python中selenium_webdriver下拉框操作指南

    Python中selenium_webdriver下拉框操作指南

    selenium 虽然过了这么多年,但是到目前为止依然是比较流行的自动化框架了,下面这篇文章主要给大家介绍了关于Python中selenium_webdriver下拉框操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Python获取文件ssdeep值的方法

    Python获取文件ssdeep值的方法

    这篇文章主要介绍了Python获取文件ssdeep值的方法,是一个比较实用的技巧,本文详细讲述了实现这一功能的具体步骤及相关注意事项,需要的朋友可以参考下
    2014-10-10
  • Python实现打印螺旋矩阵功能的方法

    Python实现打印螺旋矩阵功能的方法

    这篇文章主要介绍了Python实现打印螺旋矩阵功能的方法,简单描述了螺旋矩阵的概念、原理及Python实现方法,需要的朋友可以参考下
    2017-11-11
  • Python实现的文轩网爬虫完整示例

    Python实现的文轩网爬虫完整示例

    这篇文章主要介绍了Python实现的文轩网爬虫,结合完整实例形式分析了Python爬虫爬取文轩网图书信息的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • 深入了解NumPy 高级索引

    深入了解NumPy 高级索引

    这篇文章主要介绍了NumPy 高级索引的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • pytorch 实现打印模型的参数值

    pytorch 实现打印模型的参数值

    今天小编就为大家分享一篇pytorch 实现打印模型的参数值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python中pyplot直方图的绘制方式

    python中pyplot直方图的绘制方式

    这篇文章主要介绍了python中pyplot直方图的绘制方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python中处理无效数据的详细教程

    Python中处理无效数据的详细教程

    无效数据是指不符合数据收集目的或数据收集标准的数据,这些数据可能来自于不准确的测量、缺失值、错误标注、虚假的数据源或其他问题,本文就将带大家学习Python中如何处理无效数据,感兴趣的同学可以跟着小编一起来学习
    2023-06-06
  • python matplotlib中文显示参数设置解析

    python matplotlib中文显示参数设置解析

    这篇文章主要介绍了python matplotlib中文显示参数设置解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论