2015-11-06 61 views
-3

我有一組名爲像這樣的文件:Python:如何迭代基於文件名的文件集?

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} 

變化一旦我能夠重複這樣的,我需要從文件中做一些信息處理。

+2

歡迎StackOverflow上。請閱讀並遵守幫助文檔中的發佈準則。 [MCVE](http://stackoverflow.com/help/mcve)適用於此處。在您發佈代碼並準確描述問題之前,我們無法有效幫助您。 – Prune

+1

「2nn」和「4nn」文件如何?那麼'qd'和'qp'呢?這裏的所有示例文件都是'd8'? 「p8」(你根本沒有提到)呢?你需要提供一個更明確的指示,說明你在這裏實際嘗試做什麼。你只是想按特定文件名字段的特定順序遍歷文件嗎? –

+0

@EtanReisner,是的,我還需要使用2nn和4nn,我只是使用以前的值編寫了示例,並且是的,我需要按特定文件名字段的特定順序迭代文件,我無法弄清楚如何瀏覽文件名以遍歷整個字段集。 –

回答

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) 
0

,你可以像下面這樣。這可能不是準確的你想要什麼,因爲你已經留下了一些重要的細節問題,但我試圖用一種方式編寫它,以便根據你真正的需要改變它想。

簡而言之,它所做的就是使用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']