函数,返回名称中包含字符串的所有文件

2024-06-17 09:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

{rnai>返回一个目录中至少包含一个factor的名称列表。在

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

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

^{pr2}$

然而,这看起来不太优雅,我想知道是否有一种更简单/更聪明的方法来实现这一点。尤其是最后一行,我从结果列表中删除重复项。在

感谢你的帮助。在


Tags: 文件目录txt名称列表命名factorfactor1
3条回答

我会这样做:

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

break将防止重复。我把整件事改成了一个发电机,在你不需要清单的情况下,比如:

^{pr2}$

如果您确实需要列表,只需:

files = list(search_for_files(...))

您可以使用列表理解:

def search_for_files(patterns, path):
    return [os.path.join(path, name)
        for name in os.listdir(path)
            if any(pattern in name for pattern in patterns)
    ]

您可以使用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 

这样称呼:

^{pr2}$

要删除重复项,请将结果转换为集合:

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 

相关问题 更多 >