如何清理LFT命令输出文本并转为正确JSON格式(Python)
解决LFT日志文本转JSON时字段拆分错误的问题
问题根源
LFT生成的文本里,地址段/服务商字段可能包含空格(比如带空格的服务商名称),直接用空格分割会把该字段拆成多个部分,导致后续字段(如延迟)错位混乱。
解决方法
方法1:正则表达式精准匹配(推荐)
用正则捕获每行固定格式的字段,避开空格分割的歧义。假设LFT日志格式类似:
1 [AS1234] China Telecom 192.168.1.1 10ms
代码示例:
import re import json # 根据实际LFT输出调整正则规则 pattern = r'^(\d+)\s+\[([^\]]+)\]\s+(.+?)\s+(\d+\.\d+\.\d+\.\d+)\s+(\d+ms)$' data_list = [] with open('lft_output.txt', 'r') as f: for line in f: line = line.strip() if not line: continue match_result = re.match(pattern, line) if match_result: hop, asn, provider, target_ip, delay = match_result.groups() data_list.append({ 'Hop': hop, 'ASN': asn, 'Provider': provider.strip(), 'TargetIP': target_ip, 'Delay': delay }) # 写入JSON文件 with open('lft_result.json', 'w') as f: json.dump(data_list, f, indent=2)
方法2:Pandas结合正则提取字段
如果习惯用Pandas处理,可通过正则直接从每行文本中提取字段:
import pandas as pd # 读取原始文本,暂不分割 df = pd.read_csv('lft_output.txt', sep='\t', header=None, names=['raw_content']) # 正则提取各字段 df[['Hop', 'ASN', 'Provider', 'TargetIP', 'Delay']] = df['raw_content'].str.extract( r'^(\d+)\s+\[([^\]]+)\]\s+(.+?)\s+(\d+\.\d+\.\d+\.\d+)\s+(\d+ms)$' ) # 清理无效行 df = df.dropna(subset=['Hop']) # 转换为JSON df[['Hop', 'ASN', 'Provider', 'TargetIP', 'Delay']].to_json( 'lft_pandas_result.json', orient='records', indent=2 )
方法3:单独处理异常行
如果仅前两行存在拆分问题,可针对性修复后再统一处理:
import pandas as pd from io import StringIO # 读取所有有效行 with open('lft_output.txt', 'r') as f: lines = [line.strip() for line in f if line.strip()] # 处理前两行(假设服务商字段含空格) fixed_lines = [] for line in lines[:2]: parts = line.split() hop = parts[0] asn = parts[1].strip('[]') # 合并中间的服务商字段 provider = ' '.join(parts[2:-2]) target_ip = parts[-2] delay = parts[-1] fixed_lines.append(f"{hop} [{asn}] {provider} {target_ip} {delay}") # 合并处理后的行与剩余行 fixed_lines.extend(lines[2:]) # Pandas读取处理后的内容 df = pd.read_csv( StringIO('\n'.join(fixed_lines)), sep=r'\s+(?=\[|\d+\.)', engine='python', header=None, names=['Hop', 'ASN', 'Provider', 'TargetIP', 'Delay'] ) # 清理ASN字段的括号 df['ASN'] = df['ASN'].str.strip('[]') # 转存为JSON df.to_json('lft_fixed.json', orient='records', indent=2)
关键提示
- 先确认LFT日志的实际格式,调整正则或分割逻辑,确保每个字段被正确捕获。
- 若服务商字段是唯一歧义点,正则中用
.+?非贪婪匹配该字段,直到遇到固定格式的目标IP。
内容的提问来源于stack exchange,提问作者Saliinger
相关产品推荐
相关产品推荐

