gpt4 book ai didi

python - 使用 os.walk 过滤文件扩展名,但对文件名有限制

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:03 26 4
gpt4 key购买 nike

我正在使用os.walk迭代一个目录并想要计算该目录的 .java 文件中的行数。我从其他答案中发现我可以使用 fnmatch.filter仅获取像这样的 .java 文件:

for (root, dirs, files) in os.walk(project_directory):
for file in fnmatch.filter(files, '*.java'):
# get line count

但是,我想排除一些具有特定名称的文件,例如 MyExclusion.java。如何增强过滤器以避免搜索这些文件?我能想到的最好办法是添加另一个条件:

for (root, dirs, files) in os.walk(project_directory):
for file in fnmatch.filter(files, '*.java'):
if file != 'MyExclusion.java':
# get line count

可以使用 fnmatch.filter 来执行此操作,还是我被迫在此处添加条件检查?

最佳答案

您可以将过滤器传递给另一个过滤器函数,或者简单地构造一个列表理解。

>>> files = ['manifest.xml', 'Test.java', 'Foo.java', 'MyExclusion.java']
>>> [f for f in fnmatch.filter(files, '*.java')
... if f not in ('MyExclusion.java', 'Bad.java')]
['Test.java', 'Foo.java']

使用正则表达式的替代方法:编译一个模式并将其替换为 if 条件

>>> import re
>>> patt = re.compile('^(MyExclusion|Bad)')
>>> [i for i in fnmatch.filter(files, '*.java') if not patt.search(i)]
['Test.java', 'Foo.java']

考虑使用生成器表达式而不是列表理解,以便您可以执行以下操作:

    for file in (i for i in fnmatch.filter(files, '*.java') if not patt.search(i)):
# get line count

避免一次性生成第二个列表,从而潜在地减少内存消耗。

关于python - 使用 os.walk 过滤文件扩展名,但对文件名有限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com