如何更Pythonic地循环解析固定宽度TXT文件生成结构化字典
最优方案:直接用pandas内置固定宽度文件读取接口
pandas 原生提供pd.read_fwf()接口专门用于读取固定宽度分隔的文本文件,不需要手动读取后逐字段拆分,只需要预先定义好字段对应的切片区间即可,后续新增字段仅需修改配置项:
import pandas as pd # 仅需维护这一份字段配置:(字段名, 切片起始位置, 切片结束位置),结束位置传None代表读取到行尾 field_config = [ ("name", 0, 20), ("address", 21, 36), ("country", 36, 52), ("age", 53, None) ] # 直接读取文件生成规整DataFrame df = pd.read_fwf( "./my_file_path/my_file.txt", colspecs=[(start, end) for _, start, end in field_config], names=[field for field, _, _ in field_config], header=0 )
这个方案是性能最优、代码最简洁的实现,底层用pandas优化过的IO逻辑处理,大文件场景下也能稳定运行。
备选方案:基于已读取的单行列做解析
如果你需要基于已经读好的单列DataFrame做处理,可以用pandas向量化字符串操作配合预定义的切片映射实现,不需要手动逐行循环:
import pandas as pd # 预定义字段对应的切片对象,新增字段仅需在此添加配置 field_slices = { "name": slice(0, 20), "address": slice(21, 36), "country": slice(36, 52), "age": slice(53, None) } # 一次性生成所有字段的解析结果 col_dict = { field: df["cols"].str.slice(*slc.indices(10000)).str.strip().tolist() for field, slc in field_slices.items() } # 也可以直接生成DataFrame,不需要中转字典 parsed_df = pd.DataFrame({ field: df["cols"].str.slice(*slc.indices(10000)).str.strip() for field, slc in field_slices.items() })
说明
- 使用Python内置的
slice对象存储切片规则,比单独存储起止索引更直观,也可以直接复用切片逻辑 - 用pandas向量化
str.slice替代手动循环索引,不仅代码更简洁,处理10万行以上数据时性能会提升10~100倍,同时也避免了你原代码中变量名写错(比如df.cols[I]大写I的笔误)的问题 - 后续新增字段只需要修改配置字典,不需要改动解析逻辑,符合开闭原则
内容的提问来源于stack exchange,提问作者Rodrigo Vargas
相关产品推荐
相关产品推荐

