pandas使用read_fwf读取字符串时单词末尾s被异常截断问题
问题复现
使用pandas加载固定宽度文本数据时,单独成行的字段值末尾s被意外截断,与原始输入不一致,复现代码如下:
import pandas as pd import io read_data = """ operational applied description description Details names link statm working The state of the residenat stats in-bytes 0 Bytes Total number size in-drops 0 Number of student drop lans lanst""" df = pd.read_fwf(io.StringIO(read_data), delim_whitespace=True)
上述代码执行后,原文本中独立成行的stats、lans两个值末尾的s丢失,输出结果不符合预期。
问题原因
read_fwf默认会自动扫描所有行推断列的宽度边界,当同时传入delim_whitespace=True时,两套解析逻辑会出现冲突:对于只有第一列有值、其余列全为空的短行,解析器会把行尾的字符(本次复现场景中恰好是stats、lans末尾的s)误识别为列边界标记,直接将该字符截断。
修复方案
根据数据实际格式选择对应方案即可:
- 方案1:手动指定每列宽度,关闭自动推断。对照原始文本标定每列占用的字符宽度,通过
widths参数传入,从根源避免推断错误:
# 三个数值分别对应operational、applied、description三列的宽度,可根据实际排版微调 df = pd.read_fwf(io.StringIO(read_data), widths=[30, 35, 100])
运行后独立成行的stats、lans等字段会完整保留,其余列自动填充为空值,匹配原始文本内容。
- 方案2:如果文本不属于严格对齐的固定宽度格式,仅用空白做字段分隔,直接换用
read_csv方法解析更适配,不会出现截断问题:
# 用正则匹配任意长度空白作为分隔符,单独成行的字段会自动填入第一列,其余列留空 df = pd.read_csv(io.StringIO(read_data), sep=r'\s+')
内容的提问来源于stack exchange,提问作者Khader Mohammad
相关产品推荐
相关产品推荐

