【问题标题】:Function that returns all files whose name contain a string返回名称中包含字符串的所有文件的函数
【发布时间】:2016-05-16 11:03:28
【问题描述】:

我有一个目录,其中包含许多 .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)

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

感谢您的帮助。

【问题讨论】:

  • 为什么不直接使用 glob?
  • 返回的行中缺少括号。

标签: python python-2.7 function


【解决方案1】:

我会这样做:

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(...))

【讨论】:

  • 如果listOfFactorNames 有很多条目,那就不是很好了,但是它很容易阅读并且是一个生成器。
【解决方案2】:

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

【讨论】:

  • 请注意matches 可能包含重复项,因此将其转换为set 可能是个好主意。
【解决方案3】:

您可以使用列表推导:

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)
    ]

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2021-09-17
    • 2017-10-07
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多