প্যাট এর উত্তরের এক-লাইন তালিকা-বোধগম্য রূপটি রয়েছে (এর মধ্যে এটিও অন্তর্ভুক্ত রয়েছে যে আপনি একটি নির্দিষ্ট প্রকল্প ডিরেক্টরিতে গ্লোবাল করতে চেয়েছিলেন):
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) লুপ করেন এবং তারপরে প্রতিটি এক্সটেনশনের জন্য আপনি প্রতিটি ফাইলকে গ্লোব প্যাটার্নের সাথে মেলে ( for f in glob.glob(os.path.join(project_dir, ext)) take
এই সমাধানটি সংক্ষিপ্ত এবং কোনও অযৌক্তিকভাবে লুপগুলি, নেস্টেড তালিকা-বোধগম্যতা বা কোডের বিশৃঙ্খলা ব্যতীত ফাংশন ছাড়াই is খাঁটি, অভিব্যক্তিপূর্ণ, পাইথোনিক জেন ।
এই সমাধানটি আপনাকে extsআপনার কোড আপডেট না করেই এর একটি কাস্টম তালিকা পরিবর্তন করতে পারে। (এটি সর্বদা একটি ভাল অনুশীলন!)
তালিকা-বোধগম্যতা লরেন্টের সমাধানে (যা আমি ভোট দিয়েছি) একই ব্যবহার। তবে আমি যুক্তি দিয়ে বলব যে একটি পৃথক ফাংশনে একটি লাইন তৈরি করা সাধারণত অযৌক্তিক, তাই আমি এটি বিকল্প সমাধান হিসাবে সরবরাহ করছি providing
বোনাস:
আপনার যদি কেবল একটি একক ডিরেক্টরি নয়, সমস্ত উপ ডিরেক্টরিও সন্ধান recursive=Trueকরতে হয় তবে আপনি বহু-ডিরেক্টরি গ্লোব প্রতীক ** 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 প্রযুক্তিগতভাবে, **গ্লোব প্রতীকটি কেবল ফরোয়ার্ড-স্ল্যাশ সহ এক বা একাধিক অক্ষরের সাথে মেলে /(একক *গ্লোব প্রতীকের বিপরীতে )। অনুশীলনে, আপনাকে কেবল মনে রাখতে হবে যে যতক্ষণ আপনি **ফরোয়ার্ড স্ল্যাশ (পথ বিভাজক) দিয়ে ঘিরে থাকেন ততক্ষণ এটি শূন্য বা আরও বেশি ডিরেক্টরিতে মেলে।