【问题标题】:Read fixed-width text file with varchar in pandas在 pandas 中使用 varchar 读取固定宽度的文本文件
【发布时间】:2019-09-03 15:19:32
【问题描述】:

我想读取具有固定宽度格式的文本文件。不幸的是,它还包含一个 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 方式来读取这样的文件?还是我必须逐行循环并动态处理字段?

【问题讨论】:

    标签: python pandas csv varchar fixed-width


    【解决方案1】:

    您可以使用 read_table 与正则表达式分隔符和转换器来读取数据,然后进行一些后处理 (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
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多