如何使用Python动态替换DOC文件内的指定文本与元素
Python实现DOC文件自定义标记动态替换及加密货币行情插入方案
前置依赖安装
需要提前安装对应工具和Python库:
- 文档处理:Windows环境用
pywin32调用本地Word程序兼容旧版.doc格式读写,python-docx负责docx格式的内容编辑、图片插入 - 网络请求:用
requests拉取加密货币行情数据 - 正则匹配:Python内置
re模块,无需额外安装,负责提取所有符合规则的待替换标记
安装命令:
pip install python-docx pywin32 requests
非Windows环境处理旧版.doc文件需要额外安装格式转换工具:
- macOS:执行
brew install antiword - Debian/Ubuntu:执行
sudo apt install antiword
完整实现流程
1. 读取DOC文件并提取所有待替换标记
首先统一将旧版.doc转为兼容的.docx格式,再通过正则匹配所有{cripto:币种代码}格式的自定义标记,提取需要查询的加密货币符号。
import re import os import requests from docx import Document from docx.shared import Inches import win32com.client as win32 # 路径配置 INPUT_FILE = "./Example.doc" OUTPUT_FILE = "./Example_filled.docx" TEMP_DOCX = "./temp_convert.docx" TEMP_CHART = "./temp_crypto_chart.png" # doc转docx工具函数(Windows环境) def convert_doc_to_docx(input_path, output_path): word_app = win32.gencache.EnsureDispatch('Word.Application') doc = word_app.Documents.Open(os.path.abspath(input_path)) doc.SaveAs(os.path.abspath(output_path), FileFormat=16) doc.Close() word_app.Quit() # 加载文档 if INPUT_FILE.endswith(".doc"): convert_doc_to_docx(INPUT_FILE, TEMP_DOCX) doc = Document(TEMP_DOCX) else: doc = Document(INPUT_FILE) # 正则提取所有加密货币标记 match_pattern = re.compile(r'\{cripto:([A-Za-z0-9]+)\}') target_cryptos = [] for para in doc.paragraphs: found = match_pattern.findall(para.text) target_cryptos.extend(found) # 去重避免重复查询 target_cryptos = list(set(target_cryptos))
2. 获取加密货币价格与行情截图
直接复用你已经调试完成的加密货币查询逻辑,传入币种符号获取最新价格、对应日期数据以及行情截图即可,示例代码框架如下:
def fetch_crypto_info(symbol): # 替换为你已有的行情查询逻辑 # 1. 请求对应币种的最新价格、更新时间 # 2. 获取/生成对应行情截图,保存到TEMP_CHART路径 price = "1856.32" # 示例值,替换为实际接口返回 update_time = "2024-06-15 14:30 UTC" # 示例值,替换为实际接口返回 return f"{price} dolars(数据更新时间:{update_time})" # 预生成所有标记对应的替换内容 replace_map = {} for symbol in target_cryptos: replace_map[symbol] = fetch_crypto_info(symbol)
3. 替换标记并插入截图
遍历文档段落,将匹配到的标记替换为实际价格数据,同时在对应位置插入行情截图,最后保存为新文件:
# 遍历段落替换内容、插入图片 for para in doc.paragraphs: for symbol, replace_text in replace_map.items(): mark = f"{{cripto:{symbol}}}" if mark in para.text: para.text = para.text.replace(mark, replace_text) # 插入行情截图,宽度设为4英寸,可按需调整 img_run = para.add_run() img_run.add_picture(TEMP_CHART, width=Inches(4)) # 清理临时文件 if os.path.exists(TEMP_DOCX): os.remove(TEMP_DOCX) # 保存最终文档 doc.save(OUTPUT_FILE)
其他标记格式适配
如果需要匹配括号、双引号包裹的待替换内容,只需要修改对应正则规则即可,后续替换逻辑无需调整:
- 匹配英文括号包裹内容:
r'\(([a-zA-Z0-9_]+)\)' - 匹配双引号包裹内容:
r'"([a-zA-Z0-9_]+)"' - 其他自定义标记按照正则语法调整匹配规则即可。
常见问题处理
- 若Word自动排版导致标记被拆分到不同文本块,正则直接匹配段落文本会失效,可以先将段落所有文本块的内容拼接为完整字符串,匹配到目标内容后清空原有文本块,重写替换后的内容即可
- 非Windows环境可以用LibreOffice的命令行工具做doc到docx的转换,不需要依赖桌面Word程序
- 图片尺寸可以通过修改
Inches()的参数调整,避免图片过大破坏文档排版
内容的提问来源于stack exchange,提问作者Leonardo Araujo
相关产品推荐
相关产品推荐

