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

การขยายรูปแบบชื่อพา ธ สไตล์ Unix ใน Python (glob)


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

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

ส่วนใหญ่มีสามฟังก์ชั่นในโมดูล glob

glob()

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

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

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

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

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

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

ชื่อพาธรูปแบบสามารถมีอักขระตัวแทน ? คำสั่งต่อไปนี้จะพิมพ์รายการไฟล์ที่มีชื่อสามตัวอักษรที่มีตัวอักษรสองตัวแรกคือ 'pp'

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

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

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

ไวยากรณ์ต่อไปนี้ทำให้ไฟล์ที่ตรงกับเส้นทางที่กำหนดถูกพิมพ์ซ้ำ

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

หากต้องการพิมพ์ชื่อไดเร็กทอรีซ้ำๆ ในไดเร็กทอรีปัจจุบัน

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

iglob()

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

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

หนี()

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

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