问题描述
我正在尝试读取具有固定宽度格式的文本文件,但最后一列的宽度不同,而且我不知道最大宽度是多少。它看起来像这样:
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 |