You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python代码中docx格式保存报错的解决方案咨询

问题原因

报错的核心是**termcolor的colored()函数返回的文本包含ANSI控制字符**,这些字符是终端用来渲染颜色的特殊序列,不属于XML允许的合法字符范围。python-docx在将文本写入docx文件(底层为XML格式)时会校验字符合法性,因此抛出该错误。

解决方案

放弃使用termcolor(它仅适用于终端输出),直接利用python-docx自身API设置字体样式(红色、加粗);同时过滤输入文本中可能存在的非法控制字符,确保文本符合XML规范。

完整修改后的代码

import re
from docx import Document
from docx.shared import RGBColor
import string

def clean_text(text):
    # 过滤XML不允许的控制字符,保留可打印字符及必要空白符
    allowed_chars = string.printable + '\n\t'
    return ''.join([c for c in text if c in allowed_chars])

def add_highlighted_paragraph(document, text, keywords):
    paragraph = document.add_paragraph()
    # 构建匹配所有关键词的正则(精确匹配)
    keyword_pattern = '|'.join([re.escape(kw) for kw in keywords])
    # 拆分文本为普通部分和关键词部分
    parts = re.split(f'({keyword_pattern})', text)
    
    for part in parts:
        if part in keywords:
            # 关键词设置为红色加粗
            run = paragraph.add_run(part)
            font = run.font
            font.color.rgb = RGBColor(255, 0, 0)
            font.bold = True
        else:
            # 普通文本使用默认样式
            paragraph.add_run(part)
    return paragraph

# 输入文件名
input_file = "input.txt"

try:
    with open(input_file, 'r', encoding='utf-8') as file:
        input_text = file.read()
except FileNotFoundError:
    print("文件未找到。")
    exit()

# 用户指定的关键词
input_keywords = ["we","We","This Paper","This paper", "this paper", "this Paper", "our", "Our", "this study", "This study","This Study","this research", "This Research", "This research"]
input_keywords = [kw.strip() for kw in input_keywords]

# 清理输入文本中的非法字符
cleaned_text = clean_text(input_text)

# 创建docx文档
document = Document()

# 按段落拆分文本并添加到文档
paragraphs = cleaned_text.split("\n\n")
for para_text in paragraphs:
    add_highlighted_paragraph(document, para_text, input_keywords)

# 保存文件
output_file = "output.docx"
document.save(output_file)
print(f"文件 {output_file} 已成功保存。")

关键改动说明

  1. 移除termcolor依赖:改用python-docx原生的Run对象设置字体样式,避免引入ANSI控制字符。
  2. 添加文本清理函数:过滤输入文本中XML不允许的控制字符,从源头避免字符合法性报错。
  3. 段落拆分与样式设置:通过正则拆分文本为普通内容和关键词,分别设置不同样式,实现原生的docx高亮效果。

内容的提问来源于stack exchange,提问作者rabby26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:54:56