Dưới đây là biến thể hiểu danh sách một dòng của câu trả lời của Pat (cũng bao gồm rằng bạn muốn toàn cầu trong một thư mục dự án cụ thể):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Bạn lặp qua các phần mở rộng ( for ext in exts
), và sau đó với mỗi phần mở rộng, bạn lấy từng tệp khớp với mẫu hình cầu ( for f in glob.glob(os.path.join(project_dir, ext)
).
Giải pháp này ngắn và không có bất kỳ vòng lặp for không cần thiết nào, việc hiểu danh sách lồng nhau hoặc các hàm để làm lộn xộn mã. Chỉ thuần khiết, biểu cảm, pythonic Zen .
Giải pháp này cho phép bạn có một danh sách tùy chỉnh exts
có thể thay đổi mà không phải cập nhật mã của bạn. (Đây luôn là một thực hành tốt!)
Việc hiểu danh sách được sử dụng tương tự trong giải pháp của Laurent (mà tôi đã bình chọn). Nhưng tôi sẽ lập luận rằng thường không cần thiết phải đưa ra một dòng duy nhất cho một chức năng riêng biệt, đó là lý do tại sao tôi cung cấp điều này như một giải pháp thay thế.
Tặng kem:
Nếu bạn cần tìm kiếm không chỉ một thư mục mà còn tất cả các thư mục con, bạn có thể vượt qua recursive=True
và sử dụng ký hiệu toàn cầu đa thư mục **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Điều này sẽ gọi glob.glob('<project_dir>/**/*.txt', recursive=True)
và như vậy cho mỗi phần mở rộng.
1 Về mặt kỹ thuật, **
biểu tượng toàn cầu chỉ đơn giản khớp với một hoặc nhiều ký tự bao gồm dấu gạch chéo về phía trước /
(không giống như *
biểu tượng hình cầu số ít ). Trong thực tế, bạn chỉ cần nhớ rằng miễn là bạn bao quanh **
bằng dấu gạch chéo (dấu phân cách đường dẫn), nó khớp với 0 hoặc nhiều thư mục.