我有一个目录,其中包含许多名为这样的.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)
然而,这似乎并不优雅,我想知道是否有更简单/更聪明的方法来实现同样的目标。特别是,我从结果列表中删除重复项的最后一行。
感谢您的帮助。
答案 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}}