接着Python之txt数据预定替换word预定义定位标记生成word报告(一)【
https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=7482354347595088424】,补充python第二部分。
python如下:
模板解析模块 - TemplateAnalyzer类
class TemplateAnalyzer:
"""Word模板解析引擎,负责:
1. 识别指定范围内的表格
2. 提取IP地址和定位标记位置
3. 建立IP-表格-标记的映射关系
"""
def __init__(self):
self.doc = Document(TEMPLATE_PATH)
# 三级字典结构:IP -> 表格索引 -> 标记 -> 位置列表
self.table_map = defaultdict(lambda: defaultdict(dict))
def _extract_markers(self, table, table_idx):
"""提取单个表格中的定位标记坐标
:param table: 表格对象
:param table_idx: 表格索引(0-based)
:return: 标记位置字典 {标记: [(行,列),...]}
"""
marker_positions = defaultdict(list)
for row_idx, row in enumerate(table.rows):
for cell_idx, cell in enumerate(row.cells):
cell_text = cell.text.strip()
for marker in CHECK_BLOCKS.keys():
if marker in cell_text:
marker_positions[marker].append((row_idx, cell_idx))
print(f"发现标记:{marker} @表格{table_idx + 1}行{row_idx + 1}列{cell_idx + 1}")
return marker_positions
def analyze(self, start_table=7, end_table=33):
"""核心分析方法
:param start_table: 起始表格编号(Word中可见编号)
:param end_table: 结束表格编号
:return: 三级映射字典
"""
print(" 开始深度分析模板结构...")
start_idx = start_table - 1
end_idx = end_table - 1
for idx in range(start_idx, end_idx + 1):
if idx >= len(self.doc.tables):
print(f"[WARN] 表格{idx+1}不存在,跳过")
break
table = self.doc.tables[idx]
print(f"\n分析表格{idx + 1}:")
ip_list = []
for row in table.rows[:10]:
for cell in row.cells:
ips = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", cell.text)
ip_list.extend(ips)
marker_data = self._extract_markers(table, idx)
for ip in set(ip_list):
for marker, positions in marker_data.items():
if positions:
self.table_map[ip][idx][marker] = positions
print(f"记录IP[{ip}]的{marker}位置")
return self.table_map
- **类定义**:`TemplateAnalyzer`类用于分析Word模板。
- **构造函数`__init__`**:加载Word模板文件,并初始化一个用于存储IP - 表格 - 标记映射关系的三级字典。
- **`_extract_markers`方法**:在单个表格中查找所有预定义标记的位置,并返回一个字典,键为标记,值为标记所在的单元格坐标列表。
- **`analyze`方法**:核心分析方法,遍历指定范围内的表格。首先提取表格前10行中的IP地址,然后提取表格中的标记位置,最后建立IP - 表格 - 标记的映射关系并返回。