Python:根据公共名称标识符对文件名列表进行分组
在目录中,我有一些文件:Python:根据公共名称标识符对文件名列表进行分组,python,regex,parsing,Python,Regex,Parsing,在目录中,我有一些文件: temperature_Resu05_les_spec_r0.0300.0 temperature_Resu05_les_spec_r0.0350.0 temperature_Resu05_les_spec_r0.0400.0 temperature_Resu05_les_spec_r0.0450.0 temperature_Resu06_les_spec_r0.0300.0 temperature_Resu06_les_spec_r0.0350.0 temperatu
temperature_Resu05_les_spec_r0.0300.0
temperature_Resu05_les_spec_r0.0350.0
temperature_Resu05_les_spec_r0.0400.0
temperature_Resu05_les_spec_r0.0450.0
temperature_Resu06_les_spec_r0.0300.0
temperature_Resu06_les_spec_r0.0350.0
temperature_Resu06_les_spec_r0.0400.0
temperature_Resu06_les_spec_r0.0450.0
temperature_Resu07_les_spec_r0.0300.0
temperature_Resu07_les_spec_r0.0350.0
temperature_Resu07_les_spec_r0.0400.0
temperature_Resu07_les_spec_r0.0450.0
temperature_Resu08_les_spec_r0.0300.0
temperature_Resu08_les_spec_r0.0350.0
temperature_Resu08_les_spec_r0.0400.0
temperature_Resu08_les_spec_r0.0450.0
temperature_Resu09_les_spec_r0.0300.0
temperature_Resu09_les_spec_r0.0350.0
temperature_Resu09_les_spec_r0.0400.0
temperature_Resu09_les_spec_r0.0450.0
我需要一个与\u rXXXX
中具有相同标识符XXXX的所有文件的列表。例如,一份这样的清单将由
temperature_Resu05_les_spec_r0.0300.0
temperature_Resu06_les_spec_r0.0300.0
temperature_Resu07_les_spec_r0.0300.0
temperature_Resu08_les_spec_r0.0300.0
temperature_Resu09_les_spec_r0.0300.0
我不知道XXXX值是什么,所以我不能遍历它们并像那样匹配。我想这最好是用正则表达式来处理。有什么想法吗?是的,正则表达式是一种有趣的方法!它可能看起来像这样:
results = {}
for fname in fnames:
id = re.search('.*_r(.*)', fname).group(1) # grabs whatever is after the final "_r" as an identifier
if id in results:
results[id] += fname
else:
results[id] = [fname]
结果将存储在字典中,results
,由id索引
我应该补充一点,只要所有文件名都具有可靠的_rXXXX结构,这种方法就可以工作。如果文件名可能与该模式不匹配,则必须检查它并采取相应的措施。不,正则表达式不是最好的方法,您的模式非常简单,只需在
\r
上str.rsplit,并使用拆分的正确元素作为键对数据进行分组。A将有效地进行分组:
from collections import defaultdict
with open("yourfile") as f:
groups = defaultdict(list)
for line in f:
groups[line.rsplit("_r",1)[1]].append(line.rstrip())
from pprint import pprint as pp
pp(groups.values())
对于您的样品,您将获得:
[['temperature_Resu09_les_spec_r0.0450.0'],
['temperature_Resu05_les_spec_r0.0300.0',
'temperature_Resu06_les_spec_r0.0300.0',
'temperature_Resu07_les_spec_r0.0300.0',
'temperature_Resu08_les_spec_r0.0300.0',
'temperature_Resu09_les_spec_r0.0300.0'],
['temperature_Resu05_les_spec_r0.0400.0',
'temperature_Resu06_les_spec_r0.0400.0',
'temperature_Resu07_les_spec_r0.0400.0',
'temperature_Resu08_les_spec_r0.0400.0',
'temperature_Resu09_les_spec_r0.0400.0'],
['temperature_Resu05_les_spec_r0.0450.0',
'temperature_Resu06_les_spec_r0.0450.0',
'temperature_Resu07_les_spec_r0.0450.0',
'temperature_Resu08_les_spec_r0.0450.0'],
['temperature_Resu05_les_spec_r0.0350.0',
'temperature_Resu06_les_spec_r0.0350.0',
'temperature_Resu07_les_spec_r0.0350.0',
'temperature_Resu08_les_spec_r0.0350.0',
'temperature_Resu09_les_spec_r0.0350.0']]
谢谢嗯,什么时候更喜欢正则表达式?我想知道它是否值得学习,因为似乎总是有一个更简单的方法!出于好奇,你是从哪里学会这些方法的!?我发现它们非常有用,但我从来没有遇到过这个默认的dict。谢谢你的回答。谢谢你,我最终还是选择了“更简单”的方法!