2015-10-28 17 views
8

Tôi cần kiểm tra thư mục hiện tại và xem tệp có phần mở rộng tồn tại hay không. Thiết lập của tôi (thường) chỉ có một tệp với phần mở rộng này. Tôi cần kiểm tra xem tập tin đó có tồn tại không, và nếu có, hãy chạy lệnh.Kiểm tra xem thư mục có chứa tập tin có phần mở rộng đã cho không

Tuy nhiên, nó chạy else nhiều lần vì có nhiều tệp có phần mở rộng thay thế. Nó chỉ phải chạy else nếu tệp không tồn tại, không phải một lần cho mỗi tệp khác. Mẫu mã của tôi là dưới đây.


Thư mục có cấu trúc như sau:

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

Khi tôi chạy:

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

Đầu ra là:

false 
false 
true 
false 

Vấn đề với điều này là nếu tôi đã thay thế print("false") bằng một cái gì đó hữu ích, nó sẽ chạy nó nhiều lần.

Edit: Tôi hỏi câu hỏi này cách đây 2 năm, và nó vẫn thấy hoạt động rất nhẹ, do đó, tôi muốn để lại điều này ở đây cho người khác: http://book.pythontips.com/en/latest/for_-_else.html#else-clause

Trả lời

11

Bạn có thể sử dụng else khối của 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. 

Các else gắn liền với một for sẽ được chạy bất cứ khi nào break bên trong vòng lặp là không thực thi. Nếu bạn nghĩ rằng một vòng lặp for là một cách để tìm kiếm thứ gì đó, thì break cho biết bạn đã tìm thấy điều gì đó chưa. Các else được chạy khi bạn không tìm thấy những gì bạn đang tìm kiếm.

Hoặc:

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

Hơn nữa bạn có thể sử dụng các mô-đun glob thay vì listdir:

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

Nếu bạn chỉ muốn kiểm tra xem bất kỳ tệp nào kết thúc bằng một tiện ích mở rộng cụ thể, hãy sử dụng any.

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

Bạn nên sử dụng các mô-đun glob để tìm kiếm chính xác các tập tin mà bạn quan tâm đến:

import glob 

fileList = glob.glob("*.true") 
for trueFile in fileList: 
    doSomethingWithFile(trueFile) 
Các vấn đề liên quan