如何用Python解析结构化EMP.txt数据文件并转换为CSV格式?
自动解析固定宽度文本转CSV的Python方案
太懂这种手动写几十上百个切片的痛苦了——不仅效率低,还容易因为数错长度搞出bug。咱们完全可以通过自动读取结构文件生成字段映射的方式,批量处理固定宽度数据,轻松转成标准CSV。下面是具体实现思路和代码:
核心逻辑
- 先解析结构文件
EMPSTRU.txt,提取每个字段的名称和长度,自动计算出每个字段在记录中的起始/结束索引(不用手动数位置)。 - 读取数据文件
EMP.txt时,按结构文件算出的单条记录总长度分割数据(毕竟你的示例数据是连续无换行的),避免依赖换行符。 - 用Python内置的
csv模块批量写入解析后的字段,生成易读易处理的CSV文件。
完整代码实现
import csv def parse_structure(struct_file_path): """解析结构文件,返回字段名列表和每个字段的(start, end)切片索引""" fields = [] field_indices = [] current_position = 0 with open(struct_file_path, 'r') as f: for line in f: # 拆分每行内容,适配"001 EMPID LENGTH 2"这种格式 parts = line.strip().split() if len(parts) >= 4: field_name = parts[1] field_length = int(parts[3]) fields.append(field_name) # 按Python切片的左闭右开规则计算索引 field_indices.append((current_position, current_position + field_length)) current_position += field_length return fields, field_indices def fixed_width_to_csv(data_file_path, struct_file_path, output_csv_path): # 第一步:解析结构文件,拿到字段和索引映射 fields, field_indices = parse_structure(struct_file_path) # 计算单条记录的总长度,用来分割大文件 record_total_length = sum(end - start for start, end in field_indices) # 处理大文件,逐条读取避免内存溢出 with open(data_file_path, 'r') as data_f, open(output_csv_path, 'w', newline='') as csv_f: writer = csv.DictWriter(csv_f, fieldnames=fields) writer.writeheader() # 写入CSV表头 while True: # 读取单条记录的内容 record = data_f.read(record_total_length) if not record: break # 读取完毕,退出循环 # 解析当前记录的所有字段 record_data = {} for field_name, (start, end) in zip(fields, field_indices): # 可选:去掉字段首尾空白,如果你需要保留原始空格可以删掉.strip() record_data[field_name] = record[start:end].strip() writer.writerow(record_data) # 调用示例,替换成你的文件路径 if __name__ == "__main__": fixed_width_to_csv( data_file_path="EMP.txt", struct_file_path="EMPSTRU.txt", output_csv_path="EMP_parsed.csv" )
代码细节说明
- 结构解析函数:不管你有150还是200个字段,它都会自动遍历结构文件,计算每个字段的切片位置,完全不用手动写
Dataline[0:2]这种代码。 - 大文件友好:用
read(record_total_length)逐条读取记录,不会一次性把75MB的文件塞进内存,处理大文件更稳妥。 - CSV写入:用
DictWriter按字段名写入,生成的CSV表头清晰,后续用Excel、Pandas处理都很方便。 - 灵活调整:如果你的数据需要保留字段内的原始空格(比如姓名中间的空格),直接去掉代码里的
.strip()就行;如果记录长度有异常,还可以加个长度校验的逻辑。
测试验证
用你给出的示例数据测试时:
- 结构文件会解析出
EMPID(0,2)、EMPNAME(2,12)等7个字段的索引 - 示例数据会被分割成两条48长度的记录(总长度2+10+1+10+10+5+10=48),解析后写入CSV的内容完全符合字段定义,不会出现错位。
内容的提问来源于stack exchange,提问作者Joydeep
相关产品推荐
相关产品推荐

