2015-10-28 8 views
8

Muszę sprawdzić bieżący katalog i sprawdzić, czy istnieje plik z rozszerzeniem. Moja konfiguracja (zwykle) ma tylko jeden plik z tym rozszerzeniem. Muszę sprawdzić, czy plik istnieje, a jeśli tak, uruchom polecenie.Sprawdź, czy katalog zawiera plik z określonym rozszerzeniem

Jednak kilka razy uruchamia else, ponieważ istnieje wiele plików z alternatywnymi rozszerzeniami. Musi on uruchamiać tylko else, jeśli plik nie istnieje, a nie raz dla każdego innego pliku. Moja próbka kodu znajduje się poniżej.


Katalog jest skonstruowany w taki sposób:

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

Kiedy biegnę:

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

Wyjście jest:

false 
false 
true 
false 

Problem polega na tym, gdybym zastąpiono print("false") przy pomocy coś przydatnego, uruchomi go wiele razy.

Edit: Poprosiłem to pytanie 2 lata temu, i to wciąż widząc bardzo łagodne działanie, dlatego chciałbym zostawić to tutaj dla innych ludzi: http://book.pythontips.com/en/latest/for_-_else.html#else-clause

Odpowiedz

11

Można użyć bloku else z 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 dołączony do for będą uruchamiane, gdy break wewnątrz pętli jest nie wykonywany. Jeśli uważasz, że pętla for jest sposobem na wyszukanie czegoś, wtedy break mówi, czy coś znalazłeś. else jest uruchamiany, gdy nie znalazłeś tego, czego szukałeś.

Alternatywnie:

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

Ponadto można użyć modułu glob zamiast listdir:

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

Jeśli chcesz tylko sprawdzić, każdy plik kończy się określonym rozszerzeniem, użyj any.

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

Należy użyć modułu glob szukać dokładnie tych plików, że jesteś zainteresowany:

import glob 

fileList = glob.glob("*.true") 
for trueFile in fileList: 
    doSomethingWithFile(trueFile) 
Powiązane problemy