如何解析含重复块的文本文件并制表,解决pandas数组长度不一致报错
问题原因
你当前代码的核心问题是没有按「数据块-块内条目」的层级处理数据:
- 每个以
GSHSH = x OK:SUCCESS开头的是独立数据块,每个块内的前5个公共字段仅出现1次,但同一个块下可能对应多条以MHGT开头的明细条目 - 你直接把所有键值对按Key追加到列表,导致公共字段的列表长度远小于明细字段的列表长度,转DataFrame时因数组长度不一致报错。
解决代码
import re import pandas as pd file = 'file.txt' with open(file, 'r', encoding='utf-8') as f: lines = f.read().splitlines() # 第一步:拆分所有数据块,每个块以GSHSH行开头,到下一个GSHSH行之前结束 blocks = [] current_block = [] for line in lines: if line.startswith('GSHSH = '): if current_block: blocks.append(current_block) current_block = [line] else: if current_block: current_block.append(line) if current_block: blocks.append(current_block) # 第二步:逐个处理每个块,生成每行的完整数据 all_rows = [] for block in blocks: common_fields = {} current_row = None for line in block: # 只处理带=的有效行 if '=' not in line: continue # 拆分键值,去除空格 k, v = [i.strip() for i in line.split('=', 1)] # 处理公共字段:第一个MHGT出现前的都是公共字段 if k == 'MHGT' and current_row is None: # 公共字段收集完成,开始生成第一条明细行 current_row = common_fields.copy() current_row[k] = v elif k == 'MHGT' and current_row is not None: # 遇到新的MHGT,保存上一行,新起一行 all_rows.append(current_row) current_row = common_fields.copy() current_row[k] = v elif current_row is None: # 还没到MHGT,存入公共字段 common_fields[k] = v else: # 存入当前明细行的字段 current_row[k] = v # 块处理完,保存最后一行(如果有) if current_row is not None: all_rows.append(current_row) # 第三步:转DataFrame,缺失值可按需填充 df = pd.DataFrame(all_rows) # 如果需要全局向下填充空缺字段,可开启下面这行 # df = df.ffill() print(df) # 输出制表格式可选 # print(df.to_markdown(tablefmt="grid"))
代码说明
- 先按
GSHSH行分割原始文件为独立数据块,避免不同块的字段混淆 - 每个块内先收集
MHGT出现前的所有公共字段,遇到第一个MHGT后开始生成明细行,每遇到新的MHGT就复制公共字段生成新行 - 所有行的字段结构统一后再转DataFrame,不会再出现长度不一致的报错
- 若需要处理不同块的字段差异(比如有的块是
KKJW有的是TKKJW),可以在转完DataFrame后自行合并字段或者用ffill()向下填充空缺值。
内容的提问来源于stack exchange,提问作者Ger Cas
相关产品推荐
相关产品推荐

