Python 带正则表达式头定义的PANDES read_表
对于格式如下的数据文件:Python 带正则表达式头定义的PANDES read_表,python,regex,pandas,Python,Regex,Pandas,对于格式如下的数据文件: ("Time Step" "courantnumber_max" "courantnumber_avg" "flow-time") 0 0.55432343242 0.34323443432242 0.00001 我可以使用pd.read\u表(文件名,sep='',header=0),除了第一个头,“时间步长”,它将得到所有正确的结果 有没有办法为read\u table()指定一个正则表达式字符串,用于解析标题名 我知道解决这个问题的一种方法是使用regex为re
("Time Step" "courantnumber_max" "courantnumber_avg" "flow-time")
0 0.55432343242 0.34323443432242 0.00001
我可以使用pd.read\u表(文件名,sep='',header=0)
,除了第一个头,“时间步长”
,它将得到所有正确的结果
有没有办法为read\u table()
指定一个正则表达式字符串,用于解析标题名
我知道解决这个问题的一种方法是使用regex为read\u table()
函数创建一个名称列表,但我认为可能/应该有一种方法可以在导入本身中直接表达出来
编辑:以下是它作为标题返回的内容:
['("Time', 'Step"', 'courantnumber_max', 'courantnumber_avg', 'flow-time']
因此,在
pandas.read\u 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'])
代码说明:
获取标题()
:
参数,file
是包含标头的文件对象headerline
是标头名称存在的行号(从1开始)regexstring
是将被送入re.split()
的模式。强烈建议您在regex模式前添加一个r
<代码>排除
是要从标题列表中删除的杂项字符串列表
我使用的正则表达式模式:
首先,我们有管道(
|
)符号。这样做是为了将“普通”拆分方法(即“
)和其他需要删除的内容(即括号)分开
从第一组开始:(?:“”)
。我们有(…)
,因为我们希望按顺序匹配这些字符。”
是我们想要匹配的东西,作为分割的对象。?:
基本上是说不捕获组的内容。这很重要/有用,否则re.split()
会将任何组作为单独的项目保留。请参阅文档中的
第二组就是其他角色。如果没有它们,第一个和最后一个项目将是
”(“时间步长”
和'flow-Time)\n'
。请注意,这会导致\n
被视为列表中的一个单独条目。这就是为什么我们在事后使用排除
参数来解决这个问题。您的意思是“它会把所有事情都做好”而不是“写”吗"? 此外,如果标题行确实是按照您的方式编写的,那么您的分隔符可能是“”(双引号-空格-双引号),而不是简单的“(空格)。我面临着类似的情况,标题很奇怪。一般来说,我会用普通的python文件I/O只捕获标题,执行一些正则表达式和其他解构,以生成带有标题名的列表,然后直接以read_csv形式传递该列表,忽略第0行。我想请你也这么做。是的,我的意思是“对”而不是“写”。我已经改正了。改变分隔符不也会改变数据本身的解析方式吗?否则,你的建议就行了。不管怎样,我现在正在处理一个外部正则表达式解决方案。假设您没有更改quotechar='',quoting=0
的默认值,它应该可以正常工作。@gyx hh在使用指定的quotechar='',quoting=0
再次运行它之后,我会遇到同样的问题。我认为前面的括号就是问题所在。请参阅编辑,了解标题名称解析中到底出了什么问题。啊,是的,你是对的-很抱歉,当我复制示例时,我排除了括号。我认为在pd.read\u table中没有办法做到这一点