Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การจับคู่รูปแบบชื่อไฟล์ Unix ใน Python (fnmatch)


รูปแบบไวด์การ์ดที่ใช้ในบรรทัดคำสั่งเชลล์ Unix แตกต่างจากไวยากรณ์นิพจน์ทั่วไป ในไลบรารีมาตรฐานของ Python โมดูล fnmatch จัดเตรียมรูปแบบไวด์การ์ด Unix

ฟังก์ชันต่อไปนี้ถูกกำหนดไว้ในโมดูล fnmatch

fnmatch()

ฟังก์ชันนี้ต้องการพารามิเตอร์สองตัว – ชื่อไฟล์และรูปแบบสตริงของอักขระ ชื่อไฟล์ตรงกับรูปแบบที่กำหนดและฟังก์ชันจะคืนค่าเป็น True หรือ False

ตัวอย่างต่อไปนี้แสดงรายการไฟล์ทั้งหมดที่ตรงกับรูปแบบ “*.py” จากไดเร็กทอรีปัจจุบัน

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

fnmatchcase()

ฟังก์ชันนี้คล้ายกับ fnmatch() อย่างไรก็ตาม ฟังก์ชันนี้จะทำการจับคู่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่กับชื่อไฟล์

ในตัวอย่างต่อไปนี้ ไฟล์ทั้งหมดที่มีชื่อขึ้นต้นด้วย 'l' และ '.py' จะถูกรวบรวมก่อนในอ็อบเจกต์รายการไฟล์ ฟังก์ชัน fnmatch() ใช้สำหรับพิมพ์เฉพาะชื่อที่ขึ้นต้นด้วยอักขระ '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

ตัวกรอง()

ฟังก์ชันนี้ส่งคืนเฉพาะไฟล์ที่มีชื่อตรงกับพารามิเตอร์รูปแบบที่กำหนด

คำสั่งต่อไปนี้จะส่งคืนรายการไฟล์ที่มีนามสกุล '.txt' จากไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบัน

>>> 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']

แปล()

ฟังก์ชันนี้มีประโยชน์ในการแปลงรูปแบบสไตล์ UNIX เป็นรูปแบบ RegEx ที่สอดคล้องกัน ค่าส่งคืนของฟังก์ชัน translate() ควรแปลงเป็นนิพจน์ทั่วไปโดยใช้ฟังก์ชัน compile() ของ re module จากนั้นจะใช้เพื่อจับคู่รูปแบบ

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

ในบทความนี้มีการอธิบายฟังก์ชันในโมดูล fnmatch