2013-03-17 194 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

相关问题