আমি ভিতরে ফাইল একটি গুচ্ছ সঙ্গে একটি ডিরেক্টরির আছে: eee2314
, asd3442
... আর eph
।
ফাংশন eph
দিয়ে শুরু হওয়া সমস্ত ফাইল আমি বাদ দিতে চাই glob
।
আমি এটা কিভাবে করবো?
আমি ভিতরে ফাইল একটি গুচ্ছ সঙ্গে একটি ডিরেক্টরির আছে: eee2314
, asd3442
... আর eph
।
ফাংশন eph
দিয়ে শুরু হওয়া সমস্ত ফাইল আমি বাদ দিতে চাই glob
।
আমি এটা কিভাবে করবো?
উত্তর:
গ্লোব জন্য প্যাটার্ন বিধিগুলি নিয়মিত প্রকাশ নয়। পরিবর্তে, তারা মানক ইউনিক্স পাথ সম্প্রসারণ নিয়ম অনুসরণ করে follow মাত্র কয়েক বিশেষ অক্ষর আছেন: দুটি ভিন্ন বন্য কার্ড, এবং চরিত্র রেঞ্জ [থেকে সমর্থিত উল্লিখিত glob ]।
সুতরাং আপনি নিদর্শন সহ কিছু ফাইল বাদ দিতে পারেন।
উদাহরণস্বরূপ _
গ্লোব সহ ফাইলগুলি (ফাইলগুলির শুরু দিয়ে ) বাদ দেওয়ার জন্য আপনি ব্যবহার করতে পারেন:
files = glob.glob('files_path/[!_]*')
eph
তা বাদ দিতে কিন্তু অন্য যে কোনও কিছু দিয়ে শুরু করতে পারে। উদাহরণস্বরূপ [!e][!p][!h]
শুরু হওয়া ফাইলগুলি ফিল্টার করে ফেলবে eee
।
আপনি সেটগুলি কাটাতে পারেন:
set(glob("*")) - set(glob("eph*"))
set(glob("*")) - set(glob("eph*"))
(এবং "এপিএফ *" এর শেষে * লক্ষ্য করুন)
list(set(glob("*")) - set(glob("eph")))
আপনি glob
ফাংশন সহ নিদর্শনগুলি বাদ দিতে পারবেন না , গ্লোবগুলি কেবল অন্তর্ভুক্তির নিদর্শনগুলির জন্য অনুমতি দেয় । গ্লোব্বিং সিনট্যাক্স অত্যন্ত সীমাবদ্ধ (এমনকি একটি [!..]
অক্ষরের শ্রেণি অবশ্যই একটি চরিত্রের সাথে মেলে, তাই এটি শ্রেণীর মধ্যে নেই এমন প্রতিটি চরিত্রের জন্য অন্তর্ভুক্তির নমুনা )।
আপনাকে নিজের ফিল্টারিং করতে হবে; একটি তালিকা বোঝার এখানে সাধারণত দুর্দান্তভাবে কাজ করে:
files = [fn for fn in glob('somepath/*.txt')
if not os.path.basename(fn).startswith('eph')]
iglob
স্মৃতিতে পুরো তালিকাটি সঞ্চয় করতে এড়াতে এখানে ব্যবহার করুন
iglob
তালিকা তৈরি করে ; আপনি যা কিছু করেন তা ফিল্টারকে অলসভাবে মূল্যায়ন করে। এটি মেমরির পদক্ষেপ হ্রাস করতে সাহায্য করবে না।
os.listdir()
ফলে আপনি পুনরুক্তি মেমরি রাখা হয়। তবে somepath/*.txt
মেমরিতে একটি ডিরেক্টরিতে সমস্ত ফাইলের নাম পড়তে হবে, তারপরে সেই তালিকাটি কেবলমাত্র মেলে এমনগুলিতে হ্রাস করুন।
glob.glob(x) = list(glob.iglob(x))
। ওভারহেডের বেশি নয় তবে এটি এখনও জেনে রাখা ভাল।
গেমটি শেষ হতে পারে তবে আপনি বিকল্প হিসাবে কেবল একটি filter
ফলাফলের জন্য একটি অজগর প্রয়োগ করতে পারেন glob
:
files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)
বা ল্যাংডা প্রতিস্থাপন একটি উপযুক্ত রেগেক্স অনুসন্ধান, ইত্যাদি দিয়ে ...
সম্পাদনা: আমি কেবল বুঝতে পেরেছি যে আপনি যদি পুরো পথ ব্যবহার করেন startswith
তবে এটি কাজ করবে না, সুতরাং আপনার একটি রেইজেক্স দরকার
In [10]: a
Out[10]: ['/some/path/foo', 'some/path/bar', 'some/path/eph_thing']
In [11]: filter(lambda x: not re.search('/eph', x), a)
Out[11]: ['/some/path/foo', 'some/path/bar']
ফোল্ডারের সমস্ত ফাইলকে পুনরাবৃত্তি করার সময় নির্দিষ্ট ফাইলটি এড়িয়ে যাওয়ার কীভাবে! কোডের নীচে সমস্ত এক্সেল ফাইলগুলি এপিএফ দিয়ে শুরু হবে
import glob
import re
for file in glob.glob('*.xlsx'):
if re.match('eph.*\.xlsx',file):
continue
else:
#do your stuff here
print(file)
এই পদ্ধতিতে আপনি কোনও ফোল্ডারে ফাইলের একটি নির্দিষ্ট সেট অন্তর্ভুক্ত / বাদ দিতে আরও জটিল রেইগেক্স নিদর্শনগুলি ব্যবহার করতে পারেন।
সাথে তুলনা করুন glob
, আমি সুপারিশ pathlib
, ফিল্টার এক প্যাটার্ন খুবই সহজ।
from pathlib import Path
p = Path(YOUR_PATH)
filtered = [x for x in p.glob("**/*") if not x.name.startswith("eph")]
এবং যদি আপনি আরও জটিল প্যাটার্ন ফিল্টার করতে চান তবে আপনি এটির জন্য কোনও ফাংশন সংজ্ঞায়িত করতে পারেন, ঠিক যেমন:
def not_in_pattern(x):
return (not x.name.startswith("eph")) and not x.name.startswith("epi")
filtered = [x for x in p.glob("**/*") if not_in_pattern(x)]
এই কোডটি ব্যবহার করুন, আপনি যে ফাইলগুলি শুরু eph
বা শুরু করেন সেগুলি ফিল্টার করতে পারেন epi
।
আরও সাধারণভাবে, কিছু শেল রিজেক্সের সাথে সম্মতি না দেয় এমন ফাইলগুলি বাদ দিতে আপনি মডিউলটি ব্যবহার করতে পারেন fnmatch
:
import fnmatch
file_list = glob('somepath')
for ind, ii in enumerate(file_list):
if not fnmatch.fnmatch(ii, 'bash_regexp_with_exclude'):
file_list.pop(ind)
উপরেরগুলি প্রথমে প্রদত্ত পাথ থেকে একটি তালিকা তৈরি করবে এবং তারপরে ফাইলগুলি পপ আউট করবে যা কাঙ্ক্ষিত সীমাবদ্ধতার সাথে নিয়মিত প্রকাশকে সন্তুষ্ট করবে না।
গৃহীত উত্তর দ্বারা উল্লিখিত হিসাবে, আপনি গ্লোব দিয়ে নিদর্শনগুলি বাদ দিতে পারবেন না, সুতরাং আপনার গ্লোব ফলাফল ফিল্টার করার জন্য নিম্নলিখিতটি একটি পদ্ধতি is
গ্রহণযোগ্য উত্তরটি সম্ভবত জিনিসগুলি করার সর্বোত্তম উপায় তবে আপনি যদি মনে করেন যে তালিকা বোধগম্যতাগুলি কিছুটা কুৎসিত দেখায় এবং আপনার কোডটিকে যেভাবেই হোক সর্বাধিক নাম্পাইথোনিক করতে চান (তবে আমি মনে করি) তবে আপনি এটি করতে পারেন (তবে লক্ষ্য করুন যে এটি সম্ভবত কম দক্ষ তালিকা বোঝার পদ্ধতির চেয়ে):
import glob
data_files = glob.glob("path_to_files/*.fits")
light_files = np.setdiff1d( data_files, glob.glob("*BIAS*"))
light_files = np.setdiff1d(light_files, glob.glob("*FLAT*"))
(আমার ক্ষেত্রে আমার কয়েকটি ইমেজ ফ্রেম, বায়াস ফ্রেম এবং ফ্ল্যাট ফ্রেম সবই একটি ডিরেক্টরিতে ছিল এবং আমি ইমেজ ফ্রেমগুলি চেয়েছিলাম)
যদি চরিত্রের অবস্থানটি গুরুত্বপূর্ণ না হয় , উদাহরণস্বরূপ এটি এবং - নিয়মিত অভিব্যক্তি ক্রিয়াকলাপগুলির_
সাথে ফাইলগুলি (এটি যেখানেই পাওয়া যায় ) বাদ দেয় , আপনি ব্যবহার করতে পারেন:glob
re
import glob
import re
for file in glob.glob('*.txt'):
if re.match(r'.*\_.*', file):
continue
else:
print(file)
বা আরও মার্জিত উপায়ে - list comprehension
filtered = [f for f in glob.glob('*.txt') if not re.match(r'.*\_.*', f)]
for mach in filtered:
print(mach)
আপনি নীচের পদ্ধতিটি ব্যবহার করতে পারেন:
# Get all the files
allFiles = glob.glob("*")
# Files starting with eph
ephFiles = glob.glob("eph*")
# Files which doesnt start with eph
noephFiles = []
for file in allFiles:
if file not in ephFiles:
noephFiles.append(file)
# noepchFiles has all the file which doesnt start with eph.
Thank you.