【问题标题】:Python: How to iterate through set of files based on file names?Python:如何根据文件名遍历文件集?
【发布时间】:2016-02-07 01:08:11
【问题描述】:

我有一组这样命名的文件:

qd-p64-dZP-d64-z8-8nn.q         
qd-p8-dPZ-d8-z1-1nn.q             qq-p8-dZP-d8-z1-2nn.q
qd-p8-dPZ-d8-z1-2nn.q             qq-p8-dZP-d8-z1-4nn.q
qd-p8-dPZ-d8-z1-4nn.q             qq-p8-dZP-d8-z16-1nn.q
qd-p8-dPZ-d8-z16-1nn.q            qq-p8-dZP-d8-z16-2nn.q
qd-p8-dPZ-d8-z16-2nn.q            qq-p8-dZP-d8-z16-4nn.q
qd-p8-dPZ-d8-z16-4nn.q            qq-p8-dZP-d8-z16-8nn.q
qd-p8-dPZ-d8-z16-8nn.q            qq-p8-dZP-d8-z1-8nn.q
qd-p8-dPZ-d8-z1-8nn.q             qq-p8-dZP-d8-z2-1nn.q
qd-p8-dPZ-d8-z2-1nn.q             qq-p8-dZP-d8-z2-2nn.q
qd-p8-dPZ-d8-z2-2nn.q             qq-p8-dZP-d8-z2-4nn.q 
qd-p8-dPZ-d8-z2-4nn.q             qq-p8-dZP-d8-z2-8nn.q
qd-p8-dPZ-d8-z2-8nn.q             qq-p8-dZP-d8-z32-1nn.q
qd-p8-dPZ-d8-z32-1nn.q            qq-p8-dZP-d8-z32-2nn.q
qd-p8-dPZ-d8-z32-2nn.q            qq-p8-dZP-d8-z32-4nn.q
qd-p8-dPZ-d8-z32-4nn.q            qq-p8-dZP-d8-z32-8nn.q
qd-p8-dPZ-d8-z32-8nn.q            qq-p8-dZP-d8-z4-1nn.q
qd-p8-dPZ-d8-z4-1nn.q             qq-p8-dZP-d8-z4-2nn.q
qd-p8-dPZ-d8-z4-2nn.q             qq-p8-dZP-d8-z4-4nn.q

要迭代的信息在文件名中给出,例如:

修复

dZP, 1nn, z2,  

和变化

d 

有价值观

{d8, d16, d32 d64}

然后,增加z值得到

dZP, 1nn, z4

然后再次改变 d

{d8, d16, d32 d64}   

一旦我能够像这样进行迭代,我需要对文件进行一些信息处理。

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 MCVE 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。
  • 2nn4nn 文件呢? qdqp 呢?这里所有的示例文件都是d8? p8(你根本没有提到)呢?您需要更清楚地表明您在此处实际尝试执行的操作。您是否只是想以特定文件名字段的特定顺序遍历文件?
  • @EtanReisner,是的,我还需要使用 2nn 和 4nn,我只是使用以前的值编写了示例,是的,我需要以某些文件名字段的特定顺序遍历文件,我不知道如何浏览文件名以遍历整个字段集。
  • 您是从文件列表开始并尝试从中提取这些部分,还是从这些不同的值开始并尝试生成所有文件名?
  • 文件名的其他部分呢,比如qd-qq- 前缀和扩展名.q?它们如何影响订单?

标签: python bash perl file loops


【解决方案1】:

看起来对于生成器来说是一项不错的任务。我只是为 d、z 和 n 做的,但它应该很容易推广到所有文件名字段:

def filename_generator():
    l1 = ['d8', 'd16', 'd32', 'd64']
    l2 = ['z1', 'z2', 'z4', ,'z8', 'z16', 'z32']
    l3 = ['1nn', '2nn', '4nn', '8nn']
    for n in l3:
        for z in l2:
            for d in l1:
                yield '%s-%s-%s.q' % (d, z, n)

【讨论】:

    【解决方案2】:

    你可以像下面这样。它可能不是您想要的完全,因为您在问题中遗漏了一些重要的细节,但我试图以一种方便您根据需要进行更改的方式编写它取决于你真正想要什么。

    简而言之,它的作用是使用re 模块将每个文件名分解为“字段”,并在每个字段中找到数值。这些值被分配了相应的名称,它是一个临时字典,然后用于创建具有所需字段优先级的值的namedtuple。文件名的其他部分被忽略。

    可以使用os.listdir()glob.glob()从文件系统中获取初始文件名列表。

    from collections import namedtuple
    import re
    
    filenames = ['qd-p64-dZP-d64-z8-8nn.q', 'qd-p8-dPZ-d8-z1-1nn.q',
                 'qd-p8-dPZ-d8-z1-2nn.q', 'qd-p8-dPZ-d8-z1-4nn.q',
                 'qd-p8-dPZ-d8-z16-1nn.q', 'qd-p8-dPZ-d8-z16-2nn.q',
                 'qd-p8-dPZ-d8-z16-4nn.q', 'qd-p8-dPZ-d8-z16-8nn.q',
                 'qd-p8-dPZ-d8-z1-8nn.q', 'qd-p8-dPZ-d8-z2-1nn.q',
                 'qd-p8-dPZ-d8-z2-2nn.q', 'qd-p8-dPZ-d8-z2-4nn.q',
                 'qd-p8-dPZ-d8-z2-8nn.q', 'qd-p8-dPZ-d8-z32-1nn.q',
                 'qd-p8-dPZ-d8-z32-2nn.q', 'qd-p8-dPZ-d8-z32-4nn.q',
                 'qd-p8-dPZ-d8-z32-8nn.q', 'qd-p8-dPZ-d8-z4-1nn.q',
                 'qd-p8-dPZ-d8-z4-2nn.q', 'qq-p8-dZP-d8-z1-2nn.q',
                 'qq-p8-dZP-d8-z1-4nn.q', 'qq-p8-dZP-d8-z16-1nn.q',
                 'qq-p8-dZP-d8-z16-2nn.q', 'qq-p8-dZP-d8-z16-4nn.q',
                 'qq-p8-dZP-d8-z16-8nn.q', 'qq-p8-dZP-d8-z1-8nn.q',
                 'qq-p8-dZP-d8-z2-1nn.q', 'qq-p8-dZP-d8-z2-2nn.q',
                 'qq-p8-dZP-d8-z2-4nn.q', 'qq-p8-dZP-d8-z2-8nn.q',
                 'qq-p8-dZP-d8-z32-1nn.q', 'qq-p8-dZP-d8-z32-2nn.q',
                 'qq-p8-dZP-d8-z32-4nn.q', 'qq-p8-dZP-d8-z32-8nn.q',
                 'qq-p8-dZP-d8-z4-1nn.q', 'qq-p8-dZP-d8-z4-2nn.q',
                 'qq-p8-dZP-d8-z4-4nn.q']
    
    filename_order = ('p', 'd', 'z', 'nn')  # order fields occur in the filenames
    fieldname_order = ('z', 'd', 'p', 'nn')  # desired field sort order
    OrderedTuple = namedtuple('OrderedTuple', fieldname_order)
    
    def keyfunc(filename):
        values = [int(value) for value in re.findall(r'-\D*(\d+)', filename)]
        parts = dict(zip(filename_order, values))
        return OrderedTuple(**parts)
    
    filenames.sort(key=keyfunc)  # sort filename list in-place
    

    列表中文件名的结果顺序:

    ['qd-p8-dPZ-d8-z1-1nn.q', 'qd-p8-dPZ-d8-z1-2nn.q', 'qq-p8-dZP-d8-z1-2nn.q',
     'qd-p8-dPZ-d8-z1-4nn.q', 'qq-p8-dZP-d8-z1-4nn.q', 'qd-p8-dPZ-d8-z1-8nn.q',
     'qq-p8-dZP-d8-z1-8nn.q', 'qd-p8-dPZ-d8-z2-1nn.q', 'qq-p8-dZP-d8-z2-1nn.q',
     'qd-p8-dPZ-d8-z2-2nn.q', 'qq-p8-dZP-d8-z2-2nn.q', 'qd-p8-dPZ-d8-z2-4nn.q',
     'qq-p8-dZP-d8-z2-4nn.q', 'qd-p8-dPZ-d8-z2-8nn.q', 'qq-p8-dZP-d8-z2-8nn.q',
     'qd-p8-dPZ-d8-z4-1nn.q', 'qq-p8-dZP-d8-z4-1nn.q', 'qd-p8-dPZ-d8-z4-2nn.q',
     'qq-p8-dZP-d8-z4-2nn.q', 'qq-p8-dZP-d8-z4-4nn.q',
     'qd-p64-dZP-d64-z8-8nn.q', 'qd-p8-dPZ-d8-z16-1nn.q',
     'qq-p8-dZP-d8-z16-1nn.q', 'qd-p8-dPZ-d8-z16-2nn.q',
     'qq-p8-dZP-d8-z16-2nn.q', 'qd-p8-dPZ-d8-z16-4nn.q',
     'qq-p8-dZP-d8-z16-4nn.q', 'qd-p8-dPZ-d8-z16-8nn.q',
     'qq-p8-dZP-d8-z16-8nn.q', 'qd-p8-dPZ-d8-z32-1nn.q',
     'qq-p8-dZP-d8-z32-1nn.q', 'qd-p8-dPZ-d8-z32-2nn.q',
     'qq-p8-dZP-d8-z32-2nn.q', 'qd-p8-dPZ-d8-z32-4nn.q',
     'qq-p8-dZP-d8-z32-4nn.q', 'qd-p8-dPZ-d8-z32-8nn.q',
     'qq-p8-dZP-d8-z32-8nn.q']
    

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 2021-11-06
      • 2011-08-09
      • 2020-07-05
      • 2017-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多