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

การขยายรูปแบบพาธ Unix ใน Python (glob)

หลายครั้งโปรแกรมต้องวนซ้ำผ่านรายการไฟล์ในระบบไฟล์ บ่อยครั้งกับชื่อที่จับคู่กับรูปแบบ โมดูล glob มีประโยชน์ในการสร้างรายการไฟล์ในไดเรกทอรีเฉพาะ ที่มีนามสกุลเฉพาะ หรือมีสตริงเฉพาะเป็นส่วนหนึ่งของชื่อไฟล์

กลไกการจับคู่รูปแบบที่ใช้โดยฟังก์ชันโมดูล glob ปฏิบัติตามกฎการขยายพาธ UNIX โมดูลนี้ไม่ได้ขยาย tilde (~) และตัวแปร shell

มีหลัก 3 ฟังก์ชันในโมดูล glob:

glob()

ฟังก์ชันนี้คืนค่ารายการไฟล์ที่จับคู่กับรูปแบบที่ให้มาในพารามิเตอร์ pathname pathname สามารถเป็น absolute หรือ relative ได้ มันยังสามารถรวม wildcard เช่น * และ ? ได้

พารามิเตอร์ recursive ของฟังก์ชันนี้เป็น False ตามค่าเริ่มต้น หากเป็น True ไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันจะถูกค้นหาแบบ recursive เพื่อหาไฟล์ที่จับคู่กับรูปแบบที่ให้มา

โค้ดต่อไปนี้พิมพ์ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่มีนามสกุล '.py':

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

ในโค้ดต่อไปนี้ พารามิเตอร์ recursive=True ทำให้ไฟล์ที่มีนามสกุล '.py' จากไดเรกทอรีย่อยถูกพิมพ์ด้วย:

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

พาธเนมรูปแบบสามารถรวมตัวอักษร wildcard ? ได้ คำสั่งต่อไปนี้พิมพ์รายการไฟล์ที่ชื่อมี 3 ตัวอักษร โดย 2 ตัวแรกคือ 'pp':

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

โค้ดต่อไปนี้พิมพ์ไฟล์ที่ชื่อลงท้ายด้วยตัวเลข:

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

ไวยากรณ์ต่อไปนี้ทำให้ไฟล์ที่จับคู่กับพาธที่ให้มาถูกพิมพ์แบบ recursive:

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

เพื่อพิมพ์ชื่อไดเรกทอรีแบบ recursive ในไดเรกทอรีปัจจุบัน:

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

iglob()

ฟังก์ชันนี้คืนค่าอ็อบเจ็กต์เจเนอเรเตอร์ (generator object) แทนที่จะเป็นรายการไฟล์ โดยใช้ฟังก์ชัน next() ชื่อไฟล์ต่อไปสามารถพิมพ์ได้ดังนี้:

>>> it = glob.iglob('*.py')
>>> type(it)

>>> while True:
...     try:
...         file = next(it)
...         print(file)
...     except StopIteration:
...         break

escape()

ฟังก์ชันนี้ escape ตัวอักษรที่ให้มา นี่มีประโยชน์เมื่อไฟล์ที่มีตัวอักษรบางตัวต้องเป็นส่วนหนึ่งของชื่อ ตัวอย่างต่อไปนี้ค้นหาไฟล์ที่มีตัวอักษรใดตัวหนึ่งในสตริง 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