首页 > 解决方案 > 带有正则表达式标头定义的 pandas read_table

问题描述

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

("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']

标签: pythonregexpandas

解决方案


因此,在函数内部似乎实际上不可能做到这一点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()。强烈建议您r在正则表达式模式前添加 a。exclude是要从 headerlist 中删除的杂项字符串的列表。

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


首先,我们有管道 ( |) 符号。这样做是为了将“正常”拆分方法(即" ")和其他需要删除的东西(即括号)分开。

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

第二组只是其他角色。没有它们,第一项和最后一项将是'("Time Step'and 'flow-time)\n'。请注意,这会导致\n将其视为列表的单独条目。这就是为什么我们在exclude事后使用这个论点来解决这个问题。


推荐阅读