Проверить, содержит ли каталог файл с заданным расширением

Мне нужно проверить текущий каталог и посмотреть, существует ли файл с расширением. Моя установка (обычно) будет иметь только один файл с этим расширением. Мне нужно проверить, существует ли этот файл, и если да, запустить команду.

Однако он запускает else несколько раз, поскольку существует несколько файлов с альтернативными расширениями. Он должен запускать else только в том случае, если файл не существует, а не один раз для каждого другого файла. Мой пример кода ниже.


Каталог устроен так:

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


person spikespaz    schedule 28.10.2015    source источник


Ответы (3)


Вы можете использовать блок else блока for:

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.

else, присоединенный к for, будет выполняться всякий раз, когда break внутри цикла не выполняется. Если вы считаете цикл for способом поиска чего-либо, то break сообщает, нашли ли вы это что-то. else запускается, когда вы не нашли то, что искали.

В качестве альтернативы:

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
person Bakuriu    schedule 28.10.2015
comment
с новой библиотекой pathlib вы можете изменить glob на if not list(pathlib.Path(".").rglob("*.true")) - person Sylvain; 25.06.2020

Если вы хотите только проверить, что любой файл заканчивается определенным расширением, используйте any.

import os
if any(File.endswith(".true") for File in os.listdir(".")):
    print("true")
else:
    print("false")
person Kevin    schedule 28.10.2015

Вы должны использовать модуль glob для поиска именно тех файлов, которые вас интересуют. в:

import glob

fileList = glob.glob("*.true")
for trueFile in fileList:
    doSomethingWithFile(trueFile)
person bgporter    schedule 28.10.2015