具有多个扩展名的Python搜索文件

时间:2018-03-08 22:00:30

标签: python

我希望搜索一个目录,以及所有包含的子目录,以查找其名称中包含子字符串的文件以及三个可能的扩展名之一

请您帮我编辑以下代码

os.chdir(directory)
files = glob.glob("**/*{}*.pro".format(myStr), recursive = True)

我希望找到扩展名为.pro,.bd3和.mysql

的文件

我正在运行Python 3.5

3 个答案:

答案 0 :(得分:0)

You could create a list and loop over it

exten_to_find = ['.pro','bd3','.mysql']

you could format like this for iteration

files = glob.glob("**/*{x}*.{y}".format(x = myStr, y = extension_toFind), recursive = True)

答案 1 :(得分:0)

你可以尝试:

def get_files_with_extension(my_str, exts):
    for f in glob.iglob("**/*{}*.*".format(my_str), recursive = True):
        if any(f.endswith(ext) for ext in exts):
            yield f

答案 2 :(得分:0)

Actual-glob语法无法执行此操作。大多数现代shell的“增强型glob”语法都可以,但我很确定Python的glob模块只是非常轻微的增强。

在幕后,glob是一个非常简单的模块,the docs链接到源。正如您所看到的,它最终会延伸到fnmatch,这也是一个非常简单的模块,并且最终只是构建一个正则表达式并遵循它。当然,你可以在正则表达式中进行替换。

因此,一个选项是从glob.pyfnmatch.py分叉所有代码,这样您就可以构建一个更高级的模式以传递给re

但最简单的事情就是在这里停止使用glob。这是工作的错误工具。只需使用os.walk并自行过滤。

如果您了解如何编写像r'.*{}.*\.(pro|md3|mysql)'.format(myStr)这样的正则表达式,请使用它来过滤;如果没有,只要写下你知道该怎么做;性能成本可能很小,您将能够自己扩展和维护它。

files = []
for root, dirnames, filenames in os.walk('.'):
    for file in filenames:
        fname, fext = os.path.splitext(file)
        if fext in {'pro', 'md3', 'mysql'} and myStr in fname:
            files.append(os.path.join(root, file))

如果事实证明做一个set方法和一个字符串方法确实比正则表达式慢得多,它会产生影响,并且你不能自己编写正则表达式,那就回过头来问一个新问题。 (如果你不知道如何调试它,我不会指望我上面使用的那个。)

另外,如果您之前使用的是Python ...我认为3.5 ... os.walk实际上可能比iglob慢。在这种情况下,您需要在PyPI上查找betterwalk,这是当前实现所基于的模块。