python - 带有正则表达式标头定义的 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']
解决方案
因此,在函数内部似乎实际上不可能做到这一点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
事后使用这个论点来解决这个问题。
推荐阅读
- javascript - 在 javascript 中为数组和对象使用 variable.length 时需要注意什么?
- javascript - React Native:从函数渲染文本
- javascript - 计算滚动时窗口的高度
- android - 如何使用底部导航栏将地图视图设置为全屏
- javascript - 带有 ng-if 的模板字符串有错误:$parse:syntax
- .net - 点网框架与点网核心 sdk
- rest - 按主机名过滤在我的 WireShark 中不起作用
- sql - 如何在 SQL 中查找两个日期时间行的时间平均值?
- objective-c - 如何将 Win32 FILETIME 转换为 NSDate
- reactjs - 如何在 reactjs 的新选项卡/窗口中打开表单