2013-03-17 189 views
2

我使用Python,並有一個不同文件類型的文件名列表。文本文件可能如下所示:如何將Python格式字符串與列表中的元素進行匹配?

01.txt 
02.txt 
03.txt 
... 

讓我們假設文本文件都以這種方式編號。現在我想要得到所有文本文件的編號範圍從1到25.所以我想通過GUI提供一個像%02i.txt這樣的格式字符串來標識所有匹配的文件名。

我到目前爲止的解決方案是嵌套for循環。在整個名單外循環迭代和內循環計數從1到25每個文件:

fmt = '%02i.txt' 
for f in files: 
    for i in range(1, 25+1): 
     if f == fmt % i: 
      # do stuff 

此嵌套循環看起來並不很漂亮,複雜性是O(N²)。所以在很長的名單上可能需要一段時間。 有沒有更聰明的/ pythonic的方式來做到這一點?

嗯,是的,我可以使用像^\d{2}\.txt$這樣的正則表達式,但使用%的格式字符串更容易輸入。

回答

2

您可以使用一組:

fmt = '%02i.txt' 
targets = {fmt % i for i in range(1, 25+1)} 

然後

for f in files: 
    if f in targets: 
     # do stuff 
+3

恭喜10K! – unutbu 2013-03-17 02:13:39

+0

很好的解決方案。我用這個。 :-) – 2013-03-30 00:12:46

0

更Python的方式通過文件迭代是通過使用glob模塊。

>>> import glob 
>>> for f in glob.iglob('[0-9][0-9].txt'): 
     print f 


01.txt 
02.txt 
03.txt 
+0

我不會調用'glob'模塊* pythonic *,而'set'通常很好用。 – 2013-03-17 03:02:00

+0

@RikPoggi這是一個模塊,旨在查找遵循模式的文件名。這些模式只能是簡單的,在這種情況下,我認爲沒有理由不使用它。如果可以的話,我覺得你應該使用內置模塊。 – jamylak 2013-03-17 03:04:11

+0

你的回答非常好,我只是在討論*「更多pythonic」*聲明:glob可能是解決OP問題的標準方法,但這並不能使它變成pythonic或pythonic。 – 2013-03-17 03:18:54

相關問題