You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何基于表头解析固定宽度文件并按列名访问数据

固定宽度Shell输出解析最优方案

针对类netstat的固定宽度列命令输出(表头含空格、常规字符串分割/正则易错位)问题,核心解决思路是基于表头对齐位置推导列边界,而非按空格数量硬分割,实现逻辑如下:

  • 读取输出内容第一行(表头行),识别每个列名的起始偏移:列名首字符为非空,且前一字符为空格/行首,以此确定所有列的左边界
  • 相邻两个列的左边界之间的区间即为上一列的取值范围,最后一列的右边界取表头行总长度
  • 按推导得到的列区间切片所有数据行,取值后自动去除首尾空白,得到无错位的单元格内容
  • 结果存储为键为表头名、值为对应列所有行值列表的字典,直接支持按表头名访问列数据
  • 基于每列最大内容宽度补全空格,导出列对齐的逗号分隔格式文件

实现代码

def parse_fixed_width_file(file_path):
    # 读取文件,过滤空行
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = [line.rstrip('\n') for line in f if line.strip()]
    header = lines[0]

    # 识别所有列的起始偏移
    col_starts = [0]
    for i in range(1, len(header)):
        if header[i] != ' ' and header[i-1] == ' ':
            col_starts.append(i)
    
    # 生成每列的配置:(列名, 起始偏移, 结束偏移)
    col_configs = []
    for idx, start in enumerate(col_starts):
        end = col_starts[idx+1] if idx < len(col_starts)-1 else len(header)
        col_name = header[start:end].strip()
        col_configs.append((col_name, start, end))
    
    # 构建按列名访问的结果字典
    result = {name: [] for name, _, _ in col_configs}
    for line in lines[1:]:
        # 短行补空格避免切片越界
        padded_line = line.ljust(len(header))
        for name, start, end in col_configs:
            cell_val = padded_line[start:end].strip()
            result[name].append(cell_val)
    return result

def export_aligned_csv(data, output_path):
    col_names = list(data.keys())
    # 计算每列最大宽度保证对齐
    col_widths = []
    for col in col_names:
        max_w = max(len(str(v)) for v in data[col] + [col])
        col_widths.append(max_w)
    
    output_lines = []
    # 写入表头
    output_lines.append(",".join(name.ljust(w) for name, w in zip(col_names, col_widths)))
    # 写入数据行
    total_rows = len(data[col_names[0]])
    for row_idx in range(total_rows):
        row_cells = []
        for col, w in zip(col_names, col_widths):
            row_cells.append(str(data[col][row_idx]).ljust(w))
        output_lines.append(",".join(row_cells))
    
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write("\n".join(output_lines))

# 调用示例
if __name__ == "__main__":
    # 解析netstat类输出文件
    parsed = parse_fixed_width_file("port_listen.txt")
    # 按列名直接访问,和PowerShell使用体验一致
    print(parsed["Proto"])  # 输出 ['tcp', 'tcp', 'tcp'...]
    print(parsed["PID/Program name"])
    # 导出对齐的逗号分隔文件
    export_aligned_csv(parsed, "result.csv")

方案特性

  • 无错位问题:列边界完全从表头对齐规则推导,不受列名内空格、单元格内容含空格的影响
  • 无第三方依赖:纯Python标准库实现,可直接运行
  • 兼容性广:适配netstat、ss、df等所有标准固定宽度列格式的Shell命令输出
  • 导出结果自动对齐:逗号分隔的每列宽度统一,可读性强

极端场景适配:如果遇到命令输出列间用2个以上空格分隔、列名内存在单个空格的特殊格式,只需调整列起始偏移的判定规则为「当前字符非空,且前两个字符均为空格」即可适配。

内容的提问来源于stack exchange,提问作者Jona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:54:23