Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Mở rộng mẫu đường dẫn kiểu Unix trong Python (glob)


Nhiều lần một chương trình cần lặp qua danh sách file trong hệ thống file, thường với tên khớp một mẫu. Mô-đun glob hữu ích trong việc tạo danh sách file trong thư mục cụ thể, có phần mở rộng nhất định, hoặc với một chuỗi nhất định như một phần của tên file.

Cơ chế khớp mẫu dùng bởi các hàm mô-đun glob tuân theo quy tắc mở rộng đường dẫn UNIX. Mô-đun này tuy nhiên không mở rộng dấu ngã (~) và biến shell.

Có chủ yếu ba hàm trong mô-đun glob:

glob()

Hàm này trả về danh sách file khớp với mẫu cho trước trong tham số pathname. pathname có thể là tuyệt đối hoặc tương đối. Nó cũng có thể bao gồm ký tự đại diện như * và ?.

Tham số recursive của hàm này mặc định là False. Nếu True, thư mục con của thư mục hiện tại được tìm kiếm đệ quy để tìm file khớp với mẫu cho trước.

Mã sau in tất cả file trong thư mục hiện tại với phần mở rộng '.py'.

>>> import glob
>>> for file in glob.glob("*.py"):
...     print(file)

Trong mã sau, tham số recursive=True khiến file với phần mở rộng '.py' từ thư mục con cũng được in.

>>> for file in glob.glob("*.py", recursive=True):
...     print(file)

Mẫu đường dẫn có thể bao gồm ký tự đại diện ?. Câu lệnh sau in danh sách file có tên ba chữ cái với hai chữ cái đầu là 'pp'.

>>> for file in glob.glob("pp?.py"):
...     print(file)

Mã sau in file có tên kết thúc bằng chữ số.

>>> for file in glob.glob('*[0-9].py'):
...     print(file)

Cú pháp sau khiến file khớp với đường dẫn cho trước được in đệ quy.

>>> glob.glob('**/*.py', recursive=True)

Để in tên thư mục đệ quy trong thư mục hiện tại:

>>> glob.glob('tcl/**/', recursive=True)

iglob()

Hàm này trả về đối tượng generator thay vì danh sách file. Dùng hàm next(), tên file tiếp theo có thể được in như dưới.

>>> it = glob.iglob('*.py')
>>> type(it)
<class 'generator'>
>>> while True:
...     try:
...         file = next(it)
...         print(file)
...     except StopIteration:
...         break

escape()

Hàm này thoát (escape) các ký tự cho trước. Điều này hữu ích khi file với một số ký tự đặc biệt cần là một phần của tên. Ví dụ sau tìm file có bất kỳ ký tự nào trong chuỗi chars.

>>> chars = '[]()#'
>>> for char in chars:
...     esc = '*' + glob.escape(char) + '.py'
...     for file in (glob.glob(esc)):
...         print(file)
xyz[.py
pp[].py
pp(.py
pp#.py