带有正则表达式标头定义的熊猫read_table

时间:2018-08-14 15:32:26

标签: python regex pandas

对于格式如下的数据文件:

("Time Step" "courantnumber_max" "courantnumber_avg" "flow-time")
0 0.55432343242 0.34323443432242 0.00001

我可以使用pd.read_table(filename, sep=' ', header=0),它将为第一个标头"Time Step"提供除 之外的所有正确内容。

是否可以为read_table()指定一个正则表达式字符串以用于解析标头名称?

我知道解决此问题的一种方法是仅使用正则表达式为read_table()函数创建要使用的名称列表,但我认为可能/应该有一种方法可以在导入中直接表达该名称本身。

编辑:这是它作为标题返回的内容:

['("Time', 'Step"', 'courantnumber_max', 'courantnumber_avg', 'flow-time']

1 个答案:

答案 0 :(得分:1)

因此,在pandas.read_table()函数内部似乎实际上不可能做到这一点。以下是我最终用来解决问题的实际解决方案:

import re

def get_headers(file, headerline, regexstring, exclude):
    # Get string of selected headerline
    with file.open() as f:
        for i, line in enumerate(f):
            if i == headerline-1:
                headerstring = line
            elif i > headerline-1:
                break

    # Parse headerstring
    reglist = re.split(regexstring, headerstring)

    # Filter entries in reglist
        #filter out blank strs
    filteredlist = list(filter(None, reglist)) 

        #filter out items in exclude list
    headerslist = []
    if exclude:
        for entry in filteredlist:
            if not entry in exclude:
                headerslist.append(entry)
    return headerslist

get_headers(filename, 3, r'(?:" ")|["\)\(]', ['\n'])

代码说明:

get_headers()


参数,file是包含标题的文件对象。 headerline是标头名称存在的行号(从1开始)。 regexstring是将被送入re.split()的模式。强烈建议您在正则表达式模式前加上rexclude是要从标题列表中删除的其他字符串的列表。

我使用的正则表达式模式:


首先,我们使用竖线(|)符号。这样做是为了分离“常规”拆分方法(即" ")和需要删除的其他内容(即括号)。

从第一组开始:(?:" ")。我们有(...),因为我们想按顺序匹配那些字符。 " "是我们想要匹配的东西。 ?:基本上说捕获该组的内容。这很重要/有用,因为否则re.split()会将所有组保留为单独的项目。请参阅文档中的re.split()

第二组仅仅是其他字符。没有它们,第一项和最后一项将是'("Time Step''flow-time)\n'。请注意,这导致\n被视为列表的单独条目。这就是为什么我们使用exclude参数来解决问题的原因。