Hướng dẫn python glob multiple patterns - trăn cầu nhiều mẫu

Dưới đây là biến thể tổng hợp danh sách một dòng của câu trả lời của Pat (cũng bao gồm cả bạn muốn Glob 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 tiện ích mở rộng (for ext in exts), và sau đó cho mỗi tiện ích mở rộng bạn lấy mỗi tệp phù hợp với mẫu GLAST (for f in glob.glob(os.path.join(project_dir, ext)).

Giải pháp này là ngắn và không có bất kỳ vòng lặp không cần thiết nào, sự hiểu biết danh sách lồng nhau hoặc các chức năng để làm lộn xộn mã. Chỉ là Zen tinh khiết, biểu cảm, Pythonic.

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!)

Sự hiểu biết danh sách là giống nhau được sử dụng trong giải pháp của Laurent (mà tôi đã bỏ phiếu). 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 đây như một giải pháp thay thế.

Bonus:

Nếu bạn cần tìm kiếm không chỉ một thư mục duy nhất, mà còn tất cả các thư mục phụ, bạn có thể vượt qua recursive=True và sử dụng biểu tượng GLOBITORY MULTI-Directory ** 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('/**/*.txt', recursive=True) và như vậy cho mỗi tiện ích mở rộng.

1 Về mặt kỹ thuật, biểu tượng Glob ** chỉ đơn giản là khớp với một hoặc nhiều ký tự bao gồm cả slash phía trước

files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
1 (không giống như biểu tượng GLOB
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
2 số ít). Trong thực tế, bạn chỉ cần nhớ rằng miễn là bạn bao quanh ** với các dấu gạch chéo về phía trước (phân tách đường dẫn), nó phù hợp với các thư mục bằng không hoặc nhiều hơn.

Mã nguồn: lib/glob.py Lib/glob.py


Mô -đun

files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
4 tìm thấy tất cả các tên đường dẫn khớp với một mẫu được chỉ định theo các quy tắc được sử dụng bởi vỏ Unix, mặc dù kết quả được trả về theo thứ tự tùy ý. Không có sự mở rộng Tilde nào được thực hiện, nhưng
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
5,
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
6 và phạm vi ký tự được biểu thị bằng
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
7 sẽ được khớp chính xác. Điều này được thực hiện bằng cách sử dụng các hàm
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
8 và
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
9 trong buổi hòa nhạc, và không phải bằng cách thực sự gọi một Subshell.

Lưu ý rằng các tệp bắt đầu bằng một dấu chấm (

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
0) chỉ có thể được khớp với các mẫu cũng bắt đầu bằng một dấu chấm, không giống như
files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
9 hoặc
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
2. (Đối với mở rộng biến Tilde và Shell, sử dụng
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
3 và
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
4.)

Đối với một trận đấu theo nghĩa đen, hãy bọc các nhân vật tổng hợp trong ngoặc. Ví dụ,

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
5 khớp với ký tự
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
6.

Xem thêm

Mô-đun

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
7 cung cấp các đối tượng đường dẫn cấp cao.

glob.glob (pathName, *, root_dir = none, dir_fd = none, recursive = false, wasing_hidden = falseglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Trả về một danh sách trống có thể trống các tên đường dẫn khớp với tên đường dẫn, phải là một chuỗi chứa đặc tả đường dẫn. Tên pathn có thể là tuyệt đối (như

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
8) hoặc tương đối (như
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
9) và có thể chứa các ký tự đại diện kiểu vỏ. Các liên kết symlink bị hỏng được bao gồm trong các kết quả (như trong vỏ). Việc kết quả có được sắp xếp hay không phụ thuộc vào hệ thống tệp. Nếu một tệp thỏa mãn các điều kiện được xóa hoặc thêm trong cuộc gọi của hàm này, liệu có bao gồm tên đường dẫn cho tệp đó có được xác định không.

Nếu root_dir không phải là

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
0, thì đó phải là một đối tượng giống như đường dẫn chỉ định thư mục gốc để tìm kiếm. Nó có tác dụng tương tự đối với
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 khi thay đổi thư mục hiện tại trước khi gọi nó. Nếu tên pathName tương đối, kết quả sẽ chứa các đường dẫn so với root_dir.path-like object specifying the root directory for searching. It has the same effect on
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 as changing the current directory before calling it. If pathname is relative, the result will contain paths relative to root_dir.

Hàm này có thể hỗ trợ các đường dẫn liên quan đến các mô tả thư mục với tham số DIR_FD.paths relative to directory descriptors with the dir_fd parameter.

Nếu đệ quy là đúng, mẫu

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
2, sẽ phù hợp với bất kỳ tệp và thư mục, thư mục con và liên kết tượng trưng nào với các thư mục. Nếu mẫu được theo sau bởi một
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
3 hoặc
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
4 thì các tệp sẽ không khớp.

Nếu bao gồm_hidden là đúng, mẫu ____ ____32 sẽ phù hợp với các thư mục ẩn.

Tăng một sự kiện kiểm toán

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
6 với các đối số
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8.auditing event
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
6 with arguments
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8.

Tăng một sự kiện kiểm toán

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
9 với các đối số
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8, for ext in exts2, for ext in exts3.auditing event
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
9 with arguments
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8, for ext in exts2, for ext in exts3.

Ghi chú

Sử dụng mẫu ____ ____32 trên các cây thư mục lớn có thể tiêu thụ một khoảng thời gian không phù hợp.

Đã thay đổi trong phiên bản 3.5: Hỗ trợ cho các quả cầu đệ quy bằng cách sử dụng ____ ____32.Support for recursive globs using “

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
2”.

Đã thay đổi trong phiên bản 3.10: Đã thêm các tham số root_dir và dir_fd.Added the root_dir and dir_fd parameters.

Đã thay đổi trong phiên bản 3.11: Đã thêm tham số bao gồm_hidden.Added the include_hidden parameter.

glob.iglob (pathName, *, root_dir = none, dir_fd = none, recursive = false, wasing_hidden = false)iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Trả về một trình lặp lại mang lại các giá trị giống như

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 mà không thực sự lưu trữ tất cả chúng đồng thời.iterator which yields the same values as
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 without actually storing them all simultaneously.

Tăng một sự kiện kiểm toán

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
6 với các đối số
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8.auditing event
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
6 with arguments
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8.

Tăng một sự kiện kiểm toán

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
9 với các đối số
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8, for ext in exts2, for ext in exts3.auditing event
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
9 with arguments
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
7,
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
8, for ext in exts2, for ext in exts3.

Đã thay đổi trong phiên bản 3.5: Hỗ trợ cho các quả cầu đệ quy bằng cách sử dụng ____ ____32.Support for recursive globs using “

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
2”.

Đã thay đổi trong phiên bản 3.10: Đã thêm các tham số root_dir và dir_fd.Added the root_dir and dir_fd parameters.

Đã thay đổi trong phiên bản 3.11: Đã thêm tham số bao gồm_hidden.Added the include_hidden parameter.

glob.iglob (pathName, *, root_dir = none, dir_fd = none, recursive = false, wasing_hidden = false)escape(pathname)

Trả về một trình lặp lại mang lại các giá trị giống như

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 mà không thực sự lưu trữ tất cả chúng đồng thời.

Glob.escape (Tên đường dẫn) ¶

Thoát khỏi tất cả các ký tự đặc biệt (

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
6, for f in glob.glob(os.path.join(project_dir, ext)7 và for f in glob.glob(os.path.join(project_dir, ext)8). Điều này rất hữu ích nếu bạn muốn khớp một chuỗi theo nghĩa đen tùy ý có thể có ký tự đặc biệt trong đó. Các ký tự đặc biệt trong Drive/UNC SharePoints không bị thoát ra, ví dụ: Trên Windows for f in glob.glob(os.path.join(project_dir, ext)9 trả về exts0.

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']

Mới trong phiên bản 3.4.

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

Xem thêm

Ví dụ: hãy xem xét một thư mục chứa các tệp sau: exts1, exts2, exts3 và thư mục con exts4 chỉ chứa tệp exts5.
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
1 sẽ tạo ra các kết quả sau. Lưu ý làm thế nào bất kỳ thành phần hàng đầu của đường dẫn được bảo tồn.

Nếu thư mục chứa các tệp bắt đầu bằng

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
0, chúng sẽ được khớp theo mặc định. Ví dụ: hãy xem xét một thư mục chứa exts3 và exts9: