【问题标题】:Python: Group a list of file names according to common name identifierPython:根据通用名称标识符对文件名列表进行分组
【发布时间】:2016-04-08 21:50:17
【问题描述】:

在一个目录中我有一些文件:

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

我需要一个与_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 值将是什么先验,所以我无法遍历它们并像那样匹配。我认为这可能是最好的正则表达式句柄。有什么想法吗?

【问题讨论】:

    标签: python regex parsing


    【解决方案1】:

    是的,正则表达式是一种有趣的方式!它可能看起来像这样:

    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 结构,这将起作用。如果文件名有可能与该模式不匹配,您必须检查它并采取相应措施。

    【讨论】:

    • 谢谢你,我最终采用了“更简单”的方法!
    【解决方案2】:

    没有正则表达式不是最好的方法,你的模式非常简单,只需 str.rsplit_r 上并使用拆分的正确元素作为键来分组数据和。 defaultdict 将有效地进行分组:

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

    【讨论】:

    • 谢谢!嗯,那么什么时候首选正则表达式?我想知道它是否值得学习,因为似乎总有更简单的方法!
    • 出于好奇,您是从哪里学到这些方法的!?我发现它们非常有用,但我永远不会遇到这个 defaultdict。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2017-06-18
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2022-08-19
    • 2018-03-16
    相关资源
    最近更新 更多