如何使用pandas读取最后一列的宽度可变参差不齐的固定宽度文件?

问题描述

我正在尝试读取具有固定宽度格式的文本文件,但最后一列的宽度不同,而且我不知道最大宽度是多少。它看起来像这样:

ABC12345DE4G6789Z359782Y
HIJ23456KLMN7891X382W
O8Q34567RSTU8912VU
ABC23456K6MN7891T564556382S

它应该被分成这样的列:

C1  C2    C3   C4   C5
ABC 12345 DE4G 6I89 Z359782Y
HIJ 23V56 KLMN 7891 X382W
O8Q 34567 RSTU 89E2 VU
ABC 23456 K6MN 7891 4564556382S

像这样把一个大数字作为最后一列的宽度:

df = pandas.read_fwf('example_data.txt',header=None,names=['C1','C2','C3','C4','C5'],widths=[3,5,4,100])

技术上可行,但我想知道是否存在更好的方法,比如推断最后一列的最大宽度或其他什么。

解决方法

您可以使用 colspecs 参数。不确定这是否更好...

import io
import pandas as pd
# know col widths
cols = [3,5,4,4]
df = pd.read_fwf(io.StringIO("""ABC12345DE4G6789Z359782Y
HIJ23456KLMN7891X382W
O8Q34567RSTU8912VU
ABC23456K6MN7891T564556382S"""),colspecs=[(sum(cols[:i]),sum(cols[:i+1])) for i in range(len(cols))] + [(sum(cols),None)],header=None,names=['C1','C2','C3','C4','C5'])

print(df.to_markdown())
C1 C2 C3 C4 C5
0 ABC 12345 DE4G 6789 Z359782Y
1 HIJ 23456 KLMN 7891 X382W
2 O8Q 34567 RSTU 8912 VU
3 ABC 23456 K6MN 7891 T564556382S

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...