2015-08-11 16 views
5

Tôi đang cố gắng lặp qua một thư mục và tất cả các thư mục con để tìm tất cả các tệp thuộc một số loại tệp nhất định - ví dụ: chỉ .mp4, .avi, .wmv.Python - Lặp qua các tệp của một số tiện ích mở rộng nhất định

Dưới đây là những gì tôi có bây giờ, nó vòng qua tất cả các loại tập tin:

import os 
rootdir = 'input' 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
      print (os.path.join(subdir, file)) 

Cảm ơn!

Trả lời

6

Bạn có thể sử dụng os.path.splitext mà phải mất một đường dẫn và chia đuôi tệp từ phần cuối của nó:

import os 
rootdir = 'input' 
extensions = ('.mp4', '.avi', '.wmv') 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     ext = os.path.splitext(file)[-1].lower() 
     if ext in extensions: 
      print (os.path.join(subdir, file)) 
+0

Cảm ơn ozgur, mã này gần nhất với những gì tôi đã có ban đầu - cũng dễ hiểu. Các câu trả lời khác có thể hiệu quả hơn nếu được thực hiện trên quy mô lớn (không thử nghiệm!), Nhưng đối với các nhiệm vụ đơn giản của tôi, điều này sẽ hoàn toàn đủ. – pufAmuf

13

Đối với nhiều tiện ích, đơn giản nhất là chỉ để sử dụng str.endswith đi qua một tuple của chuỗi con cần kiểm tra:

for file in files: 
     if file.endswith((".avi",".mp4","wmv")): 
     print (os.path.join(subdir, file)) 

Bạn có thể sử dụng iglob như dưới đây và chuỗi các tìm kiếm trả lại hoặc sử dụng re.search nhưng sử dụng endswith là có lẽ là cách tiếp cận tốt nhất.

from itertools import chain 
from glob import iglob 

for subdir, dirs, files in os.walk(rootdir): 
    for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) for p in ("*.avi", "*.mp4", "*wmv")) : 
      print(os.path.join(subdir, file)) 

Sử dụng python3.5glob bây giờ hỗ trợ tìm kiếm đệ quy với ** cú pháp:

from itertools import chain 
from glob import iglob 

from glob import iglob 
for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) 
     for p in (rootdir+"**/*.avi", "**/*.mp4", "**/*wmv")): 
      print(file) 
+0

Cảm ơn đã giải thích chi tiết Padraic, rất thú vị như thế nào bạn có thể làm một việc trong rất nhiều cách khác nhau trong Python. – pufAmuf

+0

Không có prob, bạn được chào đón. –

+1

vượt qua trong bộ dữ liệu +1 –

3

Tôi thực sự đã làm một cái gì đó tương tự như sau một vài ngày trước và đây là cách tôi đã làm nó:

EXTENSIONS = ('.cpp','.hpp') 

for root, dirs, files in os.walk(top): 
    for file in files: 
     if file.endswith(EXTENSIONS): 
      #file which ends with extension type so do your thing! 

Hy vọng đây là những gì bạn đang làm sau. Bạn có thể xem toàn bộ tập lệnh tại đây trên số github của tôi.

+0

Cảm ơn Sam, trợ giúp của bạn được đánh giá cao! – pufAmuf

Các vấn đề liên quan