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
相关产品推荐
相关产品推荐

