在开发与运维过程中,经常会碰到一些自带格式但不算标准的结构化文本文件,比如以冒号或特定标记开头的配置段、带编号的日志块。用Python把它们里面对应的数据抓出来,比人工翻看要快得多,也更不容易漏。

认识结构化文本与标识符
所谓结构化文本,是指内容按某种规律排布、能用程序预测的纯文本。特定标识符通常是某行开头的固定字符串,例如 USER:、<RECORD> 等。我们解析的目标,就是当碰到这些标识符时,把紧随其后的内容取出来。
常见文件样例
USER: alice AGE: 28 USER: bob AGE: 31
上面这段里,USER: 和 AGE: 就是标识符。
基础提取方法
最简单的方式是逐行读取,判断行首是否以标识符开头,再用 split() 拆分。
使用字符串分割
def parse_simple(text):
result = []
current = {}
for line in text.splitlines():
if line.startswith('USER:'):
if current:
result.append(current)
current = {'user': line.split(':', 1)[1].strip()}
elif line.startswith('AGE:'):
current['age'] = line.split(':', 1)[1].strip()
if current:
result.append(current)
return result
data = """USER: alice
AGE: 28
USER: bob
AGE: 31"""
print(parse_simple(data))
这个函数每次遇到 USER: 就新建一条记录,遇到 AGE: 就补上年龄,最后得到列表。
用正则处理复杂格式
如果标识符后面内容不规则,比如夹着空格或符号,正则表达式更稳。
正则提取示例
import re
pattern = re.compile(r'^(USER|AGE):s*(.+)$')
def parse_regex(text):
records = []
item = {}
for line in text.splitlines():
m = pattern.match(line)
if not m:
continue
key, val = m.group(1).lower(), m.group(2).strip()
if key == 'user' and item:
records.append(item)
item = {}
item[key] = val
if item:
records.append(item)
return records
print(parse_regex(data))
把结果写成表格
提取完常需要看整体,用 csv 模块落盘最方便。
import csv
def save_csv(records, path):
with open(path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['user', 'age'])
writer.writeheader()
writer.writerows(records)
save_csv(parse_simple(data), 'out.csv')
小结
面对带特定标识符的结构化文本,先想清楚标识符长什么样、数据怎么跟。简单就用 startswith 加 split,乱一点就上 re。提取后转成字典列表,后续想存库还是出表都容易。写脚本时顺手处理空行和编码,日常用就够稳了。