2015-10-28 3 views
8

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

Однако он запускает 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") с что-то полезное, оно будет запускать его несколько раз.

Edit: Я задал этот вопрос 2 года назад, и она по-прежнему видит очень мягкую активность, поэтому я хотел бы оставить это здесь для других людей: http://book.pythontips.com/en/latest/for_-_else.html#else-clause

ответ

11

Вы можете использовать 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 
5

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

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

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

import glob 

fileList = glob.glob("*.true") 
for trueFile in fileList: 
    doSomethingWithFile(trueFile) 
Смежные вопросы