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} 已成功保存。")
关键改动说明
- 移除
termcolor依赖:改用python-docx原生的Run对象设置字体样式,避免引入ANSI控制字符。 - 添加文本清理函数:过滤输入文本中XML不允许的控制字符,从源头避免字符合法性报错。
- 段落拆分与样式设置:通过正则拆分文本为普通内容和关键词,分别设置不同样式,实现原生的docx高亮效果。
内容的提问来源于stack exchange,提问作者rabby26
相关产品推荐
相关产品推荐

