簡體   English   中英

在熊貓中使用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)。

有沒有一種優雅的熊貓方式可以讀取此類文件? 還是我必須逐行循環並動態處理字段?

您可以使用帶有正則表達式定界符和轉換器的read_table來讀取數據,然后進行一些后期處理( 拆分一列 ),例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM