对于格式如下的数据文件:
("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']
答案 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()
的模式。强烈建议您在正则表达式模式前加上r
。 exclude
是要从标题列表中删除的其他字符串的列表。
我使用的正则表达式模式:
首先,我们使用竖线(|
)符号。这样做是为了分离“常规”拆分方法(即" "
)和需要删除的其他内容(即括号)。
从第一组开始:(?:" ")
。我们有(...)
,因为我们想按顺序匹配那些字符。 " "
是我们想要匹配的东西。 ?:
基本上说不捕获该组的内容。这很重要/有用,因为否则re.split()
会将所有组保留为单独的项目。请参阅文档中的re.split()
。
第二组仅仅是其他字符。没有它们,第一项和最后一项将是'("Time Step'
和'flow-time)\n'
。请注意,这导致\n
被视为列表的单独条目。这就是为什么我们使用exclude
参数来解决问题的原因。