Computer >> Máy Tính >  >> Lập trình >> Python

Đối sánh mẫu tên tệp Unix bằng Python (fnmatch)

Các mẫu ký tự đại diện được sử dụng trong các dòng lệnh Unix shell khác với cú pháp biểu thức chính quy. Trong thư viện tiêu chuẩn của Python, mô-đun fnmatch cung cấp cho các mẫu thẻ đại diện Unix.

Các chức năng sau được xác định trong mô-đun fnmatch

fnmatch ()

Hàm này cần hai tham số - tên tệp và mẫu chuỗi ký tự. Tên của tệp được khớp với mẫu đã cho và hàm trả về True hoặc False.

Ví dụ sau liệt kê tất cả các tệp phù hợp với mẫu “* .py” từ thư mục hiện tại.

>>> import glob,fnmatch
>>> for files in (glob.glob('*.*')):
if (fnmatch.fnmatch(files, "*.py")):
print (files)

fnmatchcase ()

Hàm này tương tự như fnmatch (). Tuy nhiên, chức năng này thực hiện đối sánh phân biệt chữ hoa chữ thường của người bảo trợ với tên tệp.

Trong ví dụ sau, tất cả các tệp có tên bắt đầu bằng phần mở rộng ‘l’ và ‘.py’ ​​lần đầu tiên được thu thập trong một đối tượng danh sách tệp. Hàm fnmatch () được áp dụng để chỉ in những tên bắt đầu bằng ký tự ‘lo’.

>>> files=glob.glob("l*.*")
>>> files
['LICENSE.txt', 'lines.txt', 'listwidget.ui', 'lo1.ui', 'lo2.ui', 'lo3.ui', 'logo.png', 'logo.svg', 'lw.ui']
>>> for file in files:
if fnmatch.fnmatchcase(file,"lo*.*")==True:
print (file)
lo1.ui
lo2.ui
lo3.ui
logo.png
logo.svg

filter ()

Hàm này chỉ trả về những tệp có tên khớp với tham số mẫu đã cho.

Câu lệnh sau trả về danh sách các tệp có phần mở rộng ‘.txt’ trong số tất cả các tệp trong thư mục hiện tại.

>>> fnmatch.filter(files,"*.txt")
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt', 'zen.txt', 'zen1.txt', 'zenbak.txt']

translate ()

Chức năng này rất hữu ích để chuyển đổi mẫu kiểu UNIX thành dạng RegEx tương ứng. Giá trị trả về của hàm translate () nên được chuyển đổi trong biểu thức chính quy bằng cách sử dụng hàm compile () của mô-đun re. Sau đó, giá trị này được sử dụng để khớp với mẫu.

>>> pattern="*.txt"
>>> import re
>>> reg=fnmatch.translate(pattern)
>>> reg
'(?s:.*\\.txt)\\Z'
>>> rec=re.compile(reg)
>>> for file in glob.glob("*.*"):
if re.match(rec,file):
print (file)

Trong bài viết này, các chức năng trong mô-đun fnmatch đã được giải thích.