如何在Python中解析基于位置的.txt文件并合并关联行?
固定位置格式文本转DataFrame及多行合并方案
一、需求说明
现有数千条位置固定格式的.txt文本行,常规行固定为56字符,各字段对应固定索引范围:
- Field1:[0:14]
- Field2:[15:31]
- Field3:[32:35]
- Field4:[36:53]
- Field5:[54:56]
需将其转换为指定结构的DataFrame,同时处理特殊场景:满足特定条件时,会有不同长度的两行对应同一数据,需合并为单行。
二、实现代码
使用Python的pandas库处理,代码如下:
import pandas as pd # 定义字段与切片范围对应关系(Python切片左闭右开,需匹配需求中的位置) field_mapping = { "Field1": slice(0, 15), # 对应需求中的[0:14] "Field2": slice(15, 32), # 对应需求中的[15:31] "Field3": slice(32, 36), # 对应需求中的[32:35] "Field4": slice(36, 54), # 对应需求中的[36:53] "Field5": slice(54, 57) # 对应需求中的[54:56] } # 读取文本文件 with open("your_file.txt", "r", encoding="utf-8") as f: raw_lines = [line.strip() for line in f if line.strip()] processed_data = [] index = 0 total_lines = len(raw_lines) while index < total_lines: current_line = raw_lines[index] # 处理常规56字符行或需合并的主行 if len(current_line) == 56: # 判断下一行是否为附加行(可根据实际条件调整,这里用长度非56作为判断) if index + 1 < total_lines and len(raw_lines[index+1]) != 56: # 合并主行与附加行 combined_content = current_line + raw_lines[index+1] row = {} for field, slice_range in field_mapping.items(): if field == "Field4": # 将附加内容合并到Field4(可根据需求调整字段) row[field] = combined_content[slice_range] + combined_content[56:] else: row[field] = combined_content[slice_range] # 可选:新增字段单独存储附加内容 row["附加信息"] = raw_lines[index+1] processed_data.append(row) index += 2 # 跳过已处理的附加行 else: # 常规单行提取字段 row = {field: current_line[slice_range] for field, slice_range in field_mapping.items()} processed_data.append(row) index += 1 else: # 处理异常行(单独出现的附加行,可根据需求调整逻辑) index += 1 # 转换为DataFrame result_df = pd.DataFrame(processed_data) # 查看结果 print(result_df.head())
三、代码说明
- 字段映射:通过
slice对象定义每个字段对应的文本索引范围,适配Python的左闭右开切片规则。 - 文件读取:读取所有行并去除空行、换行符,避免无效数据干扰。
- 多行合并逻辑:通过循环遍历,判断当前行是否为需合并的主行,若下一行是附加行则合并后提取字段;可根据实际需求调整合并条件(比如用特定字段值判断,而非长度)。
- DataFrame转换:将处理后的字典列表转换为DataFrame,直接得到目标结构。
内容的提问来源于stack exchange,提问作者pedrosjo
相关产品推荐
相关产品推荐

