গ্লোব বাদ্য প্যাটার্ন


105

আমি ভিতরে ফাইল একটি গুচ্ছ সঙ্গে একটি ডিরেক্টরির আছে: eee2314, asd3442... আর eph

ফাংশন ephদিয়ে শুরু হওয়া সমস্ত ফাইল আমি বাদ দিতে চাই glob

আমি এটা কিভাবে করবো?

উত্তর:


148

গ্লোব জন্য প্যাটার্ন বিধিগুলি নিয়মিত প্রকাশ নয়। পরিবর্তে, তারা মানক ইউনিক্স পাথ সম্প্রসারণ নিয়ম অনুসরণ করে follow মাত্র কয়েক বিশেষ অক্ষর আছেন: দুটি ভিন্ন বন্য কার্ড, এবং চরিত্র রেঞ্জ [থেকে সমর্থিত উল্লিখিত glob ]।

সুতরাং আপনি নিদর্শন সহ কিছু ফাইল বাদ দিতে পারেন।
উদাহরণস্বরূপ _গ্লোব সহ ফাইলগুলি (ফাইলগুলির শুরু দিয়ে ) বাদ দেওয়ার জন্য আপনি ব্যবহার করতে পারেন:

files = glob.glob('files_path/[!_]*')

10
এটি অবশ্যই অফিশিয়াল ডকুমেন্টেশনে থাকতে হবে, দয়া করে কেউ এটিকে ডকস.পাইথন.আর.৩.৩
ভিটালি জেডনেভিচ

6
নোট করুন যে গ্লোব নিদর্শনগুলি ওপি দ্বারা নির্ধারিত প্রয়োজনীয়তার সাথে সরাসরি পূরণ করতে পারে না: কেবল যে ফাইলগুলি শুরু হয় ephতা বাদ দিতে কিন্তু অন্য যে কোনও কিছু দিয়ে শুরু করতে পারে। উদাহরণস্বরূপ [!e][!p][!h]শুরু হওয়া ফাইলগুলি ফিল্টার করে ফেলবে eee
মার্টিজন পিটারস

60

আপনি সেটগুলি কাটাতে পারেন:

set(glob("*")) - set(glob("eph*"))

4
সত্যিই আকর্ষণীয় সমাধান! তবে আমার কেসটি দু'বার পড়ার জন্য অত্যন্ত ধীর হতে চলেছে। এছাড়াও যদি কোনও ফোল্ডারের সামগ্রী কোনও নেটওয়ার্ক ডিরেক্টরিতে বড় হয় তবে তা আবার ধীর হতে চলেছে। তবে যে কোনও ক্ষেত্রে, সত্যই কার্যকর।
আনাস্ট্যাসিওস অ্যান্ড্রোনিডিস

আপনার অপারেটিং সিস্টেমে ফাইল সিস্টেমের অনুরোধগুলি এতটা খারাপ নয় ক্যাশে করা উচিত :)
নিউট্রিনাস

এটি নিজে চেষ্টা করে দেখলাম, আমি স্রেফ টাইপ এরির পেয়েছি: অসমর্থিত অপারেণ্ড প্রকারের জন্য: 'তালিকা' এবং 'তালিকা'
টম ব্যসবি

4
@ টমবসবি সেগুলিতে রূপান্তর করার চেষ্টা করুন: set(glob("*")) - set(glob("eph*")) (এবং "এপিএফ *" এর শেষে * লক্ষ্য করুন)
জাস্কাকুর

4
পার্শ্ব নোটের মতো, গ্লোব তালিকাগুলি প্রদর্শন করে এবং সেটগুলি দেয় না, তবে এই ধরণের অপারেশনটি কেবল সেটগুলিতে কাজ করে, তাই নিউট্রিনাস কেন এটিকে ফেলেছিল । যদি আপনার তালিকাগুলির বাইরে থাকার প্রয়োজন হয় তবে কেবল পুরো অপারেশনটি একটি কাস্টে list(set(glob("*")) - set(glob("eph")))
নাথান স্মিথ

48

আপনি globফাংশন সহ নিদর্শনগুলি বাদ দিতে পারবেন না , গ্লোবগুলি কেবল অন্তর্ভুক্তির নিদর্শনগুলির জন্য অনুমতি দেয় । গ্লোব্বিং সিনট্যাক্স অত্যন্ত সীমাবদ্ধ (এমনকি একটি [!..]অক্ষরের শ্রেণি অবশ্যই একটি চরিত্রের সাথে মেলে, তাই এটি শ্রেণীর মধ্যে নেই এমন প্রতিটি চরিত্রের জন্য অন্তর্ভুক্তির নমুনা )।

আপনাকে নিজের ফিল্টারিং করতে হবে; একটি তালিকা বোঝার এখানে সাধারণত দুর্দান্তভাবে কাজ করে:

files = [fn for fn in glob('somepath/*.txt') 
         if not os.path.basename(fn).startswith('eph')]

4
iglobস্মৃতিতে পুরো তালিকাটি সঞ্চয় করতে এড়াতে এখানে ব্যবহার করুন
ইউজেন পানকভ

4
@ হারডেক্স: অভ্যন্তরীণভাবে, যাইহোকiglob তালিকা তৈরি করে ; আপনি যা কিছু করেন তা ফিল্টারকে অলসভাবে মূল্যায়ন করে। এটি মেমরির পদক্ষেপ হ্রাস করতে সাহায্য করবে না।
মার্টিজন পিটারস

@Hardex: আপনি একটি উল্লিখিত glob ব্যবহার ডিরেক্টরির নাম তারপর আপনি একটি বিন্দু আছে চাই, তারপর সর্বাধিক একটি os.listdir()ফলে আপনি পুনরুক্তি মেমরি রাখা হয়। তবে somepath/*.txtমেমরিতে একটি ডিরেক্টরিতে সমস্ত ফাইলের নাম পড়তে হবে, তারপরে সেই তালিকাটি কেবলমাত্র মেলে এমনগুলিতে হ্রাস করুন।
মার্টিজন পিটারস

আপনি ঠিক বলেছেন, এটি তাত্পর্যপূর্ণ নয়, তবে স্টক সিপিথনে রয়েছে glob.glob(x) = list(glob.iglob(x))। ওভারহেডের বেশি নয় তবে এটি এখনও জেনে রাখা ভাল।
ইউজিন পানকভ

এটি কি পুনরাবৃত্তি করে না ?. ফাইলগুলির মাধ্যমে একবার তালিকা পেতে এবং দ্বিতীয়টি নিজেই তালিকার মাধ্যমে? যদি তা হয় তবে এটি কি এক পুনরাবৃত্তিতে করা সম্ভব নয়?
রিধুবর্তন

6

গেমটি শেষ হতে পারে তবে আপনি বিকল্প হিসাবে কেবল একটি 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']

5

ফোল্ডারের সমস্ত ফাইলকে পুনরাবৃত্তি করার সময় নির্দিষ্ট ফাইলটি এড়িয়ে যাওয়ার কীভাবে! কোডের নীচে সমস্ত এক্সেল ফাইলগুলি এপিএফ দিয়ে শুরু হবে

import glob
import re
for file in glob.glob('*.xlsx'):
    if re.match('eph.*\.xlsx',file):
        continue
    else:
        #do your stuff here
        print(file)

এই পদ্ধতিতে আপনি কোনও ফোল্ডারে ফাইলের একটি নির্দিষ্ট সেট অন্তর্ভুক্ত / বাদ দিতে আরও জটিল রেইগেক্স নিদর্শনগুলি ব্যবহার করতে পারেন।


5

সাথে তুলনা করুন 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


4

আরও সাধারণভাবে, কিছু শেল রিজেক্সের সাথে সম্মতি না দেয় এমন ফাইলগুলি বাদ দিতে আপনি মডিউলটি ব্যবহার করতে পারেন 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)

উপরেরগুলি প্রথমে প্রদত্ত পাথ থেকে একটি তালিকা তৈরি করবে এবং তারপরে ফাইলগুলি পপ আউট করবে যা কাঙ্ক্ষিত সীমাবদ্ধতার সাথে নিয়মিত প্রকাশকে সন্তুষ্ট করবে না।


0

গৃহীত উত্তর দ্বারা উল্লিখিত হিসাবে, আপনি গ্লোব দিয়ে নিদর্শনগুলি বাদ দিতে পারবেন না, সুতরাং আপনার গ্লোব ফলাফল ফিল্টার করার জন্য নিম্নলিখিতটি একটি পদ্ধতি 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*"))

(আমার ক্ষেত্রে আমার কয়েকটি ইমেজ ফ্রেম, বায়াস ফ্রেম এবং ফ্ল্যাট ফ্রেম সবই একটি ডিরেক্টরিতে ছিল এবং আমি ইমেজ ফ্রেমগুলি চেয়েছিলাম)


0

যদি চরিত্রের অবস্থানটি গুরুত্বপূর্ণ না হয় , উদাহরণস্বরূপ এটি এবং - নিয়মিত অভিব্যক্তি ক্রিয়াকলাপগুলির_ সাথে ফাইলগুলি (এটি যেখানেই পাওয়া যায় ) বাদ দেয় , আপনি ব্যবহার করতে পারেন:globre

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)

-1

আপনি নীচের পদ্ধতিটি ব্যবহার করতে পারেন:

# 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.  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.