在 pandas 中读取带有 varchar 的固定宽度文本文件

Read fixed-width text file with varchar in pandas

我想读入一个具有固定宽度格式的文本文件。不幸的是,它还包含一个 varchar 字段,它告诉我开头的长度(毕竟宽度不是那么固定)。 该文件看起来像这样

Boris     1520190730     0014likes icecreamblue
Lena      1320190815     0009is blondered

架构看起来像这样:

{
'name':10,
'age':2,
'last_visit':8,
'other_field':5,
'comment':???,
'fav_color':8
}

在我遇到 varchar 字段之前,我的方法是使用 pandas' read_fwf 或通过 df[col].str[schema[col][0]:schema[col][1](略微修改架构)读取它。对于可变长度字段,这当然会失败。至少该字段在开头告诉我它的长度(0014 和 0009)。

有没有优雅的pandas方法来读取这样的文件?还是我必须逐行循环并动态处理该字段?

您可以使用 read_table with a regex delimiter and a converter to read the data, followed by a little postprocessing (splitting a column),例如:

import pandas

schema = {
    'name': 10,
    'age': 2,
    'last_visit': 8,
    'other_field': 5,
    'comment': None,
    'fav_color': 8
}


# A converter for the variable length and following columns
def converter(x):
    """Return the comment and the fav_color values separated by ','."""
    length_len = 4
    comment_len = int(x[:length_len])
    return x[length_len:comment_len + length_len:] + ',' + x[comment_len + length_len:]


# A regex as delimiter for the fixed length columns
delimiter = f"(.{{{schema['name']}}})(.{{{schema['age']}}})(.{{{schema['last_visit']}}}).{{{schema['other_field']}}}(.*)"
# Use the delimiter and converter (column 4 holds comment and fav_color) for reading the table
data = pandas.read_table('input.txt', header=None, sep=delimiter, converters={4: converter})
# Clean the table
data.dropna(inplace=True, axis=1)
# Split the comment and the fav_color columns
data[5], data[6] = data[4].str.split(',', 1).str