检查目录是否包含具有给定扩展名的文件

Check if a directory contains a file with a given extension

提问人:Jacob Birkett 提问时间:10/29/2015 最后编辑:Jacob Birkett 更新时间:1/19/2023 访问量:85919

问:

我需要检查当前目录,看看是否存在扩展名的文件。我的设置(通常)只有一个带有此扩展名的文件。我需要检查该文件是否存在,如果存在,请运行命令。

但是,它会多次运行,因为有多个具有备用扩展名的文件。它只能在文件不存在时运行 ,而不是对其他每个文件运行一次。我的代码示例如下。elseelse


目录的结构如下:

dir_________________________________________
    \            \            \            \     
 file.false    file.false    file.true    file.false

当我跑步时:

import os
for File in os.listdir("."):
    if File.endswith(".true"):
        print("true")
    else:
        print("false")

输出为:

false
false
true
false

这样做的问题是,如果我用有用的东西替换,它会多次运行它。print("false")

编辑:我在 2 年前问过这个问题,它仍然看到非常温和的活动,因此,我想把这个问题留给其他人:http://book.pythontips.com/en/latest/for_-_else.html#else-clause

文件存在

评论


答:

22赞 Kevin 10/29/2015 #1

如果只想检查任何文件是否以特定扩展名结尾,请使用 .any

import os
if any(File.endswith(".true") for File in os.listdir(".")):
    print("true")
else:
    print("false")
49赞 Bakuriu 10/29/2015 #2

您可以使用以下块:elsefor

for fname in os.listdir('.'):
    if fname.endswith('.true'):
        # do stuff on the file
        break
else:
    # do stuff if a file .true doesn't exist.

每当内部循环执行时,将运行附加到 a 的 a。如果你认为循环是一种搜索某物的方式,那么就会告诉你是否找到了那个东西。当您没有找到要搜索的内容时,将运行。elseforbreakforbreakelse

或者:

if not any(fname.endswith('.true') for fname in os.listdir('.')):
    # do stuff if a file .true doesn't exist

此外,您可以使用 glob 模块而不是:listdir

import glob
# stuff
if not glob.glob('*.true')`:
    # do stuff if no file ending in .true exists

评论

2赞 Sylvain 6/26/2020
使用新的 Pathlib 库,您可以将 glob 更改为if not list(pathlib.Path(".").rglob("*.true"))
8赞 bgporter 10/29/2015 #3

您应该使用 glob 模块来准确查找您感兴趣的文件:

import glob

fileList = glob.glob("*.true")
for trueFile in fileList:
    doSomethingWithFile(trueFile)
3赞 Jonathan Chow 12/10/2021 #4

与 @bgporter 的解决方案类似,您还可以使用 Path 执行类似操作:

from pathlib import Path
cwd = Path.cwd()
for path in cwd.glob("*.true"):
   print("true")
   DoSomething(path)

评论

0赞 Sardar Faisal 1/18/2023
你的意思是导入路径吗?from pathlib import Path
0赞 Jonathan Chow 1/19/2023
是的,没错,刚刚纠正了这一点,感谢您发现这一点。@SardarFaisal