Python文檔處理之實(shí)現(xiàn)自動刪除Word中帶指定底紋顏色的內(nèi)容
代碼功能概述
該腳本用于自動刪除 Word 文檔中帶有指定底紋顏色的解析內(nèi)容(如【分析】、【詳解】等),同時(shí)保留答案塊(以【答案】開頭的有底紋段落及其后續(xù)連續(xù)有底紋的答案內(nèi)容)。文檔中所有無底紋的段落(題目描述、選項(xiàng)等)以及答案塊內(nèi)的內(nèi)容都會被原樣保留,其余文檔結(jié)構(gòu)(表格、頁眉頁腳、樣式)不受影響。
腳本支持兩種輸入模式:
- 處理單個(gè)文件:輸入一個(gè) .docx 文件路徑,輸出一個(gè)處理后的文件。
- 批量處理文件夾:輸入一個(gè)文件夾路徑,自動處理該文件夾下所有 .docx 文件,輸出到指定文件夾。
文檔內(nèi)容示例

腳本代碼
import os
from docx import Document
from docx.oxml.ns import qn
# ====== 配置參數(shù)(請根據(jù)您的文檔修改)======
TARGET_SHADING_COLOR = 'F2F2F2' # 從檢測腳本獲得的底紋顏色
ANALYSIS_MARKERS = ['【分析】', '【詳解】', '【點(diǎn)睛】', '【錯(cuò)因】', '【避錯(cuò)關(guān)鍵】']
ANSWER_MARKER = '【答案】'
DEBUG = True # 打印詳細(xì)處理信息
# 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):
"""是否以解析標(biāo)記開頭"""
return any(text.startswith(marker) for marker in ANALYSIS_MARKERS)
def collect_all_shaded_paragraphs(doc):
"""
收集文檔中所有具有目標(biāo)底紋顏色的段落(包括文本框內(nèi))。
返回列表,每個(gè)元素為 (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):
"""
在原文檔基礎(chǔ)上直接刪除解析段落,保存到 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
# 保留后續(xù)連續(xù)的有底紋段落,直到遇到解析標(biāo)記
while i < n:
next_element, next_text, _ = shaded_items[i]
if is_analysis_start(next_text):
break
if DEBUG:
debug_info.append(f"保留答案內(nèi)容 {i}: {next_text[:50]}")
i += 1
continue
elif is_analysis_start(text):
# 解析標(biāo)記,刪除本段及其后連續(xù)的有底紋段落(直到下一個(gè)答案塊或解析標(biāo)記)
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"刪除解析內(nèi)容 {i}: {next_text[:50]}")
delete_flags[i] = True
i += 1
continue
else:
# 有底紋但不是答案也不是解析,刪除(通常不會出現(xiàn))
if DEBUG:
debug_info.append(f"刪除其他有底紋段落 {i}: {text[:50]}")
delete_flags[i] = True
i += 1
# 從后往前刪除標(biāo)記的段落元素
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} 個(gè),刪除 {sum(delete_flags)} 個(gè)")
print("=== 調(diào)試信息 ===")
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):
# 單個(gè)文件
if not input_path.endswith('.docx'):
print("請?zhí)峁?.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. 處理單個(gè)文件,輸出到指定路徑
input_path = r'C:\Desktop\讀書筆記\講義'
output_path = r'C:\Desktop\讀書筆記\講義'
process_file_or_folder(input_path, output_path)到此這篇關(guān)于Python文檔處理之實(shí)現(xiàn)自動刪除Word中帶指定底紋顏色的內(nèi)容的文章就介紹到這了,更多相關(guān)Python Word文檔處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django之導(dǎo)入并執(zhí)行自定義的函數(shù)模塊圖解
這篇文章主要介紹了django之導(dǎo)入并執(zhí)行自定義的函數(shù)模塊圖解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Django filter動態(tài)過濾與排序?qū)崿F(xiàn)過程解析
這篇文章主要介紹了Django filter動態(tài)過濾與排序?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
解決遇到PermissionError:[Errno 13] Permission den
遇到"PermissionError:[Errno 13] Permission denied"通常是權(quán)限不足導(dǎo)致,解決此問題的方法包括檢查并更改文件權(quán)限,使用管理員權(quán)限運(yùn)行命令,或接觸文件所有者,這些步驟有助于確保用戶具有執(zhí)行操作所需的權(quán)限,有時(shí),文件或目錄可能被鎖定2024-09-09
Python中實(shí)現(xiàn)3D模型動態(tài)加載的4種方法
本文討論了Python中實(shí)現(xiàn)3D模型動態(tài)加載的方法,包括PyOpenGL、Panda3D和ModernGL等,詳細(xì)介紹了基于PyOpenGL的渲染管線和模型加載;利用VPython的場景構(gòu)建和對象管理;基于ModernGL的高效GPU加速方案;四種方法綜合對比與未來優(yōu)化方向等場景,需要的朋友可以參考下2026-04-04
Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
Python辦公自動化之將任意文件轉(zhuǎn)為PDF格式
這種把某個(gè)文件轉(zhuǎn)為pdf枯燥無聊的工作,既沒有什么技術(shù)含量又累. 今天辰哥就教大家將任意文件批量轉(zhuǎn)為PDF,這里以日常辦公的word、excel、ppt為例,這三種格式的文件轉(zhuǎn)為PDF.需要的朋友可以參考下2021-06-06
Python 基于win32com客戶端實(shí)現(xiàn)Excel操作的詳細(xì)過程
這篇文章主要介紹了Python 基于win32com客戶端實(shí)現(xiàn)Excel操作的詳細(xì)過程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

