如何按索引位置解析文本文件提取指定值、追加至列表并转换为Pandas DataFrame
按索引解析文本并转换为Pandas DataFrame解决方案
嘿,我来帮你搞定这个按位置解析文本、转成DataFrame的需求!先看看你现有代码里的几个小问题,再给你修正后的完整实现:
现有代码的问题
- 循环逻辑不对:你的文本只有两行(表头+body),但你循环遍历了所有行,而且body里是多条重复的记录,你当前只提取了body的第一个100字符段,没处理后面的条目。
- 语法错误:
data列表里的"filler引号没配对,还有tc_recusa应该和headers里的tx_recusa保持一致。 - 缺少数据收集逻辑:你没有把每次提取的单条数据添加到总列表里,最后没法生成DataFrame。
修正后的完整代码
import pandas as pd # 定义列名,和你需求一致 headers = ["data_mov", "chave_detalhe", "cpf_cliente", "cd_clube", "cd_operacao", "filler", "cd_retorno", "tx_recusa"] # 读取文本文件 with open('RCPF0491.20210407.1609.txt', "r") as f: linhas = [linha.rstrip() for linha in f.readlines()] # 从表头提取日期(索引18:26) data_mov = linhas[0][18:26] # 处理body部分:按每条记录100字符拆分(根据你提取的索引[0:100]判断每条记录长度为100) body_content = linhas[1] # 拆分body为多个记录,每100个字符一条 records = [body_content[i:i+100] for i in range(0, len(body_content), 100)] # 收集所有数据行 data_list = [] for record in records: # 按索引提取每个字段 chave_detalhe = record[0:1] cpf_cliente = record[1:12] cd_clube = record[12:16] cd_operacao = record[16:17] filler = record[17:40] cd_retorno = record[40:42] tx_recusa = record[42:100].strip() # 去掉首尾空格,让结果更干净 # 组装成一行数据,添加到列表 data_row = [data_mov, chave_detalhe, cpf_cliente, cd_clube, cd_operacao, filler, cd_retorno, tx_recusa] data_list.append(data_row) # 转换为Pandas DataFrame df = pd.DataFrame(data_list, columns=headers) # 查看结果 print(df)
预期输出结果
运行代码后,你会得到如下格式的DataFrame:
| data_mov | chave_detalhe | cpf_cliente | cd_clube | cd_operacao | filler | cd_retorno | tx_recusa |
|---|---|---|---|---|---|---|---|
| 20210407 | 1 | 92790780110 | 0032 | G | (原文本对应位置的空格) | 00 | sucess |
| 20210407 | 1 | 06769754614 | 0032 | G | (原文本对应位置的空格) | 00 | sucess |
| 20210407 | 1 | 05375666600 | 0032 | G | (原文本对应位置的空格) | 00 | sucess |
| 20210407 | 1 | 32172336890 | 0032 | G | (原文本对应位置的空格) | 00 | sucess |
| 20210407 | 1 | 03767395681 | 0032 | G | (原文本对应位置的空格) | 00 | sucess |
关键说明
- 拆分body记录:根据你提取字段的索引范围,每条记录长度正好是100字符,所以用
range(0, len(body_content), 100)来拆分。如果后续记录长度有变化,只需要调整这个步长就行。 - 字段清洗:给
tx_recusa加了.strip()去掉首尾空格,避免结果里带多余的空白。 - 数据收集:用
data_list来存储所有行数据,最后一次性转成DataFrame,效率更高。
内容的提问来源于stack exchange,提问作者Jayron Soares
相关产品推荐
相关产品推荐

