นี่คือตัวแปรความเข้าใจในรายการบรรทัดเดียวของคำตอบของ Pat (ซึ่งรวมถึงสิ่งที่คุณต้องการ glob ในไดเรกทอรีโครงการเฉพาะ):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
คุณวนซ้ำส่วนขยาย ( for ext in exts
) จากนั้นสำหรับแต่ละส่วนขยายคุณนำแต่ละไฟล์ที่ตรงกับรูปแบบ glob ( for f in glob.glob(os.path.join(project_dir, ext)
)
โซลูชันนี้สั้นและไม่มีสำหรับลูปความเข้าใจรายการที่ซ้อนกันหรือฟังก์ชันที่ไม่จำเป็นเพื่อถ่วงรหัส เพียงแค่บริสุทธิ์แสดงออก pythonic เซน
โซลูชันนี้ช่วยให้คุณมีรายการที่กำหนดเองexts
ซึ่งสามารถเปลี่ยนแปลงได้โดยไม่ต้องอัปเดตโค้ดของคุณ (นี่เป็นแนวทางปฏิบัติที่ดีเสมอ!)
ความเข้าใจในรายการเป็นแบบเดียวกับที่ใช้ในโซลูชันของ Laurent (ซึ่งฉันโหวตให้) แต่ฉันจะเถียงว่าโดยปกติแล้วไม่จำเป็นที่จะต้องแยกบรรทัดเดียวไปยังฟังก์ชันแยกต่างหากซึ่งเป็นเหตุผลว่าทำไมฉันจึงให้สิ่งนี้เป็นทางเลือกอื่น
โบนัส:
หากคุณต้องการค้นหาไม่ใช่แค่ไดเร็กทอรีเดียว แต่ยังรวมถึงไดเร็กทอรีย่อยทั้งหมดด้วยคุณสามารถส่งผ่านrecursive=True
และใช้สัญลักษณ์ glob หลายไดเร็กทอรี**
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
สิ่งนี้จะเรียกglob.glob('<project_dir>/**/*.txt', recursive=True)
และอื่น ๆ สำหรับแต่ละส่วนขยาย
1 ในทางเทคนิค**
สัญลักษณ์ลูกโลกจะจับคู่อักขระตั้งแต่หนึ่งตัวขึ้นไปรวมถึงเครื่องหมายทับ /
(ไม่เหมือนกับ*
สัญลักษณ์ลูกโลกเอกพจน์) ในทางปฏิบัติคุณต้องจำไว้ว่าตราบใดที่คุณล้อมรอบ**
ด้วยเครื่องหมายทับ (ตัวคั่นเส้นทาง) มันจะตรงกับไดเรกทอรีศูนย์หรือมากกว่านั้น