返回名称包含字符串

时间:2016-05-16 11:03:29

标签: python python-2.7 function

我有一个目录,其中包含许多名为这样的.txt文件:

factor1.txt
factor2.txt
factor3.txt
factor4.txt
factor1-factor2.txt
factor2-factor3.txt

现在我想创建一个函数,它接受一个因子名称列表,比如searchFiles(listOfFactorNames),然后返回该目录中所有文件的列表,其名称至少包含列表中指定的一个事实名称因子名称。

例如,如果listOfFactorNames=['factor1','factor4'],则searchFiles(listOfFactorNames)应返回列表['factor1.txt','factor4.txt','fator1-factor2.txt']

到目前为止,我写了以下内容:

def search_for_files(listOfFactorNames,path):
    listOfFiles=os.listdir(path)
    resList=[]
    for f in listOfFiles:
        for factor in listOfFactorNames:
            if factor in f:
                resList.append(f)
    return list(set(resList)

然而,这似乎并不优雅,我想知道是否有更简单/更聪明的方法来实现同样的目标。特别是,我从结果列表中删除重复项的最后一行。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我这样做:

def search_for_files(listOfFactorNames, path):
    for f in os.listdir(path):
        for factor in listOfFactorNames:
            if factor in f:
                yield f
                break

break可以防止重复。在你不需要列表的情况下,我将整个事情改为生成器以提高效率,例如:

for f in search_for_files(...):
    print f

如果您确实需要一个清单,只需:

files = list(search_for_files(...))

答案 1 :(得分:1)

您可以使用glob来帮助您:

import glob
import os

def find_matching_files(patterns, file_dir):
   matches = []
   for pattern in patterns:
      search_path = os.path.join(file_dir, '*{}*'.format(pattern))
      for match in glob.iglob(search_path):
         matches.append(match)
   return matches 

这样称呼:

i = find_matches_files(['factor1', 'factor2'], '/home/some/dir')

要修剪重复项,请将结果转换为集合:

i = set(find_matches_files(['factor1', 'factor2'], '/home/some/dir'))

您也可以选择更改方法:

def find_unique_matching_files(patterns, file_dir):
   matches = set()
   for pattern in patterns:
      search_path = os.path.join(file_dir, '*{}*'.format(pattern))
      for match in glob.iglob(search_path):
         matches.add(match)
   return matches 

答案 2 :(得分:0)

您可以使用列表理解:

{{1}}