পুনরাবৃত্তভাবে ফাইলগুলি খুঁজতে গ্লোব () কীভাবে ব্যবহার করবেন?


738

এটি আমার কাছে রয়েছে:

glob(os.path.join('src','*.c'))

তবে আমি এসআরসি-র সাব-ফোল্ডারগুলি অনুসন্ধান করতে চাই। এরকম কিছু কাজ করবে:

glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))

তবে এটি স্পষ্টতই সীমাবদ্ধ এবং জটিল।

উত্তর:


1354

পাইথন 3.5+

যেহেতু আপনি একটি নতুন পাইথন উপর, আপনি ব্যবহার করা উচিত pathlib.Path.rglobথেকে pathlibমডিউল।

from pathlib import Path

for path in Path('src').rglob('*.c'):
    print(path.name)

আপনি যদি পাথলিব ব্যবহার করতে না চান glob.globতবে কেবল ব্যবহার করুন তবে recursiveকীওয়ার্ড প্যারামিটারে পাস করতে ভুলবেন না ।

যে ক্ষেত্রে ফাইলগুলি বিন্দু (।) দিয়ে শুরু হয়; বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলি বা ইউনিক্স ভিত্তিক সিস্টেমে লুকানো ফাইলগুলির মতো, os.walkনীচের সমাধানটি ব্যবহার করুন ।

পুরানো পাইথন সংস্করণ

পুরানো পাইথন সংস্করণগুলির জন্য, os.walkএকটি ডিরেক্টরিকে পুনরাবৃত্তভাবে হাঁটাতে ব্যবহার করতে এবং fnmatch.filterকোনও সাধারণ অভিব্যক্তির বিপরীতে মেলে:

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
    for filename in fnmatch.filter(filenames, '*.c'):
        matches.append(os.path.join(root, filename))

3
পাইথনের বয়স ২.২ এর চেয়ে পুরনো রয়েছে os.path.walk()যা ব্যবহারের চেয়ে একটু বেশিই মজাদারos.walk()
জন লা রুই

20
@gnibbler আমি জানি এটি একটি পুরানো মন্তব্য, তবে আমার মন্তব্যটি কেবল লোকজনকে জানাতেই যে অবহেলা os.path.walk()করা হয়েছে এবং পাইথন 3-এ অপসারণ করা হয়েছে
পেড্রো কুনহা

5
@ ডিভিসি এই প্রশ্নটিতে জিজ্ঞাসা করা নির্দিষ্ট ক্ষেত্রে কাজ করতে পারে তবে 'এ * .সি' ইত্যাদির মতো প্রশ্নের সাথে এটি ব্যবহার করতে চায় এমন কোনও ব্যক্তির কল্পনা করা সহজ, সুতরাং আমার মনে হয় বর্তমানের কিছুটা ধীর উত্তরটি রাখাই মূল্যবান।
জোহান ডাহলিন

2
এটির মূল্যের জন্য, আমার ক্ষেত্রে গ্লোব সহ 10,000+ ফাইলগুলি সন্ধান করা ওএসওয়াকের চেয়ে অনেক ধীর ছিল, সুতরাং আমি সেই কারণেই পরবর্তী সমাধানের সাথে চলেছি।
গডস্মিথ

2
অজগর 3.4 এর জন্য pathlib.Path('src').glob('**/*.c')কাজ করা উচিত।
সিভিফ্যান

111

অন্যান্য সমাধানের মতো, তবে গ্লোব এর পরিবর্তে fnmatch.fnmatch ব্যবহার করা, যেহেতু os.walk ইতিমধ্যে ফাইলের নাম তালিকাভুক্ত করেছে:

import os, fnmatch


def find_files(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename


for filename in find_files('src', '*.c'):
    print 'Found C source:', filename

এছাড়াও, একটি জেনারেটর ব্যবহার করে সমস্ত ফাইল সন্ধানের পরে সেগুলি প্রক্রিয়া করার পরিবর্তে প্রতিটি ফাইল যেমন পাওয়া যায় তেমন প্রক্রিয়া করার অনুমতি দেয়।


3
কারণ 1- reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
রেখার

1
@ njzk2(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Baldrickk

73

পুনরাবৃত্ত গ্লোব্বিংয়ের জন্য ** সমর্থন করার জন্য আমি গ্লোব মডিউলটি পরিবর্তন করেছি, যেমন:

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')

https://github.com/miracle2k/python-glob2/

আপনি যখন আপনার ব্যবহারকারীদের ** সিনট্যাক্সটি ব্যবহারের সক্ষমতা সরবরাহ করতে চান তখন দরকারী এবং এইভাবে os.walk () একা যথেষ্ট যথেষ্ট নয়।


2
এটি কি প্রথম ম্যাচটি খুঁজে পাওয়ার পরে আমরা থামাতে পারি? সম্ভবত এটি প্রতিটি সম্ভাব্য ফলাফলের একটি তালিকা ফেরত দেওয়ার পরিবর্তে জেনারেটর হিসাবে এটি ব্যবহার সম্ভব করে তোলে? এছাড়াও, এটি একটি ডিএফএস বা বিএফএস? আমি অনেকটা বিএফএস পছন্দ করি, আমার মনে হয়, যাতে মূলের কাছে থাকা ফাইলগুলি প্রথমে পাওয়া যায়। এই মডিউলটি তৈরি এবং এটি গিটহাব / পিপে সরবরাহ করার জন্য +1।
আর্টঅফ ওয়ারফেয়ার

14
পাইথন 3.5 তে অফিসিয়াল গ্লোব মডিউলে ** বাক্য গঠনটি যুক্ত করা হয়েছিল।
আর্টঅফ ওয়ারফেয়ার

@ আর্টঅফ ওয়ারফেয়ার ঠিক আছে, ঠিক আছে। এটি << 3.5 এর জন্য এখনও কার্যকর।
cs95

**অফিসিয়াল গ্লোব মডিউলটি ব্যবহার করে পুনরাবৃত্ত গ্লোববিং সক্রিয় করতে , করুন:glob(path, recursive=True)
উইঙ্কলারের

68

পাইথন ৩.৪ দিয়ে শুরু করে, নতুন প্যাথলিব মডিউলে যে কোনও ক্লাসের glob()পদ্ধতি ব্যবহার করা যেতে পারে , যা ওয়াইল্ডকার্ড সমর্থন করে । উদাহরণ স্বরূপ:Path**

from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files

আপডেট: পাইথন ৩.৫ দিয়ে শুরু করে একই বাক্য গঠনটিও সমর্থিত glob.glob()


3
প্রকৃতপক্ষে, এবং এটি পাইথন 3.5 এ হবে । পাইথন ৩.৪-তে এটি ইতিমধ্যে হওয়ার কথা ছিল, তবে ভুল করে বাদ দেওয়া হয়েছিল
ট্যালিনেট


মনে রাখবেন যে আপেক্ষিক পাথগুলি পেতে আপনি pathlib.PurePath.relative_to সংমিশ্রণেও ব্যবহার করতে পারেন । আরও প্রসঙ্গে এখানে আমার উত্তর দেখুন ।
pjgranahan

40
import os
import fnmatch


def recursive_glob(treeroot, pattern):
    results = []
    for base, dirs, files in os.walk(treeroot):
        goodfiles = fnmatch.filter(files, pattern)
        results.extend(os.path.join(base, f) for f in goodfiles)
    return results

fnmatchআপনাকে ঠিক যেমন নিদর্শন দেয় globতাই এটি সত্যিই একটি দুর্দান্ত প্রতিস্থাপনglob.glob খুব কাছের শব্দার্থবিজ্ঞানের সাথে । একটি পুনরাবৃত্ত সংস্করণ (যেমন একটি জেনারেটর), এর জন্য প্রতিস্থাপন আইওডির একটি glob.iglobনগণ্য অভিযোজন ( শেষে যাওয়ার জন্য একটি ফলাফলের তালিকা yieldতৈরির পরিবর্তে কেবলমাত্র মধ্যবর্তী ফলাফলগুলি extend)।


1
recursive_glob(pattern, treeroot='.')আমি আমার সম্পাদনায় প্রস্তাবিত হিসাবে ব্যবহার সম্পর্কে আপনি কি মনে করেন ? এইভাবে, এটি উদাহরণস্বরূপ বলা যেতে পারে recursive_glob('*.txt')এবং স্বজ্ঞাত এর সিনট্যাক্সের সাথে মেলে glob
ক্রিস রেডফোর্ড

@ ক্রিসরেডফোর্ড, আমি এটিকে উভয় উপায়েই একটি ছোটখাটো সমস্যা হিসাবে দেখছি। এটি এখন যেমন দাঁড়িয়েছে, এটি "ফাইলগুলি পরে প্যাটার্ন" আর্গুমেন্টের fnmatch.filterসাথে মিলছে, যা একক-যুক্তির মিলের সম্ভাবনা হিসাবে প্রায় দরকারী glob.glob
অ্যালেক্স মার্তেল্লি

24

পাইথন জন্য> = 3.5 আপনি ব্যবহার করতে পারেন **, recursive=True:

import glob
for x in glob.glob('path/**/*.c', recursive=True):
    print(x)

ডেমো


যদি পুনরাবৃত্তি হয় Trueতবে প্যাটার্নটি ** কোনও ফাইল এবং শূন্য বা আরও বেশি directoriesএবং এর সাথে মেলেsubdirectories । যদি প্যাটার্নটি একটি দ্বারা অনুসরণ করা হয় তবে os.sepকেবল ডিরেক্টরি এবং subdirectoriesমেলান।


2
এটি পাথলিব.পথ ('./ পাথ /')। গ্লোব (' * / ') এর চেয়ে আরও ভাল কাজ করে কারণ এটি 0
চার্লস ওয়াকার

20

আপনি os.walkআপনার মানদণ্ডের সাথে মেলে এমন ফাইলের নাম সংগ্রহ করতে ব্যবহার করতে চাইবেন । উদাহরণ স্বরূপ:

import os
cfiles = []
for root, dirs, files in os.walk('src'):
  for file in files:
    if file.endswith('.c'):
      cfiles.append(os.path.join(root, file))

15

নেস্টেড তালিকা os.walkবোধগম্যগুলির পরিবর্তে এবং এর পরিবর্তে সহজ প্রত্যয় ম্যাচিংয়ের সমাধান এখানে রয়েছে glob:

import os
cfiles = [os.path.join(root, filename)
          for root, dirnames, filenames in os.walk('src')
          for filename in filenames if filename.endswith('.c')]

এটি ওয়ান-লাইনারে সংকুচিত করা যেতে পারে:

import os;cfiles=[os.path.join(r,f) for r,d,fs in os.walk('src') for f in fs if f.endswith('.c')]

বা একটি ফাংশন হিসাবে সাধারণীকরণ:

import os

def recursive_glob(rootdir='.', suffix=''):
    return [os.path.join(looproot, filename)
            for looproot, _, filenames in os.walk(rootdir)
            for filename in filenames if filename.endswith(suffix)]

cfiles = recursive_glob('src', '.c')

আপনার যদি পুরো globস্টাইলের নিদর্শনগুলির প্রয়োজন হয় তবে আপনি অ্যালেক্স এবং ব্রুনোর উদাহরণ অনুসরণ করতে এবং ব্যবহার করতে পারেন fnmatch:

import fnmatch
import os

def recursive_glob(rootdir='.', pattern='*'):
    return [os.path.join(looproot, filename)
            for looproot, _, filenames in os.walk(rootdir)
            for filename in filenames
            if fnmatch.fnmatch(filename, pattern)]

cfiles = recursive_glob('src', '*.c')

7

.Jpg এক্সটেনশন দিয়ে আমার ছবিগুলি পুনরুদ্ধার করতে হয়েছিল। আমি ফটোরেক চালিয়েছি এবং বিপুল প্রকারের এক্সটেনশন থাকাতে 4579 ডিরেক্টরি 2.2 মিলিয়ন ফাইল পুনরুদ্ধার করেছি below নীচের স্ক্রিপ্টের সাহায্যে আমি 50133 ফাইলগুলি হাভিন .jpg এক্সটেনশনটি কয়েক মিনিটের মধ্যেই নির্বাচন করতে সক্ষম হয়েছি:

#!/usr/binenv python2.7

import glob
import shutil
import os

src_dir = "/home/mustafa/Masaüstü/yedek"
dst_dir = "/home/mustafa/Genel/media"
for mediafile in glob.iglob(os.path.join(src_dir, "*", "*.jpg")): #"*" is for subdirectory
    shutil.copy(mediafile, dst_dir)

7

বিবেচনা করুন pathlib.rglob()

এটি প্রদত্ত আপেক্ষিক প্যাটার্নের সামনে যুক্ত হওয়ার Path.glob()সাথে কল করার মতো "**/":

import pathlib


for p in pathlib.Path("src").rglob("*.c"):
    print(p)

এখানে ট্যালিনাতের সম্পর্কিত পোস্ট এবং অন্য কোথাও একটি অনুরূপ পোস্ট দেখুন


5

জোহান এবং ব্রুনো উল্লিখিত হিসাবে ন্যূনতম প্রয়োজনীয়তার উপর দুর্দান্ত সমাধান সরবরাহ করে। আমি সবেমাত্র ফর্মিক প্রকাশ করেছি যা এন্টি ফাইলসেট এবং গ্লোব প্রয়োগ করে যা এটি এবং আরও জটিল পরিস্থিতি পরিচালনা করতে পারে। আপনার প্রয়োজনের একটি বাস্তবায়ন হ'ল:

import formic
fileset = formic.FileSet(include="/src/**/*.c")
for file_name in fileset.qualified_files():
    print file_name

1
ফর্মিক কি পরিত্যক্ত বলে মনে হচ্ছে ?! এবং এটা পাইথন 3 সমর্থন করে না ( bitbucket.org/aviser/formic/issue/12/support-python-3 )
blueyed

5

অন্যান্য উত্তরের ভিত্তিতে এটি আমার বর্তমান কার্যকরী বাস্তবায়ন, যা কোনও রুট ডিরেক্টরিতে নেস্টেড এক্সএমএল ফাইলগুলি পুনরুদ্ধার করে:

files = []
for root, dirnames, filenames in os.walk(myDir):
    files.extend(glob.glob(root + "/*.xml"))

আমি অজগর সাথে সত্যিই মজা করছি :)


3

কেবল গ্লোব মডিউলটি ব্যবহার করে এটি করার আরেকটি উপায়। আরগ্লোব পদ্ধতিটি প্রারম্ভিক বেস ডিরেক্টরি এবং মেলে একটি প্যাটার্ন সহ বীজ করুন এবং এটি ফাইলের নামের সাথে মিলে একটি তালিকা ফিরে আসবে।

import glob
import os

def _getDirs(base):
    return [x for x in glob.iglob(os.path.join( base, '*')) if os.path.isdir(x) ]

def rglob(base, pattern):
    list = []
    list.extend(glob.glob(os.path.join(base,pattern)))
    dirs = _getDirs(base)
    if len(dirs):
        for d in dirs:
            list.extend(rglob(os.path.join(base,d), pattern))
    return list

2

বা একটি তালিকা বোধগম্যতা সহ:

 >>> base = r"c:\User\xtofl"
 >>> binfiles = [ os.path.join(base,f) 
            for base, _, files in os.walk(root) 
            for f in files if f.endswith(".jpg") ] 

2

সবে এটি তৈরি করা হয়েছে .. এটি ফাইল ও ডিরেক্টরিটি স্তরক্রমিক উপায়ে মুদ্রণ করবে

তবে আমি fnmatch বা হাঁটা ব্যবহার হয়নি

#!/usr/bin/python

import os,glob,sys

def dirlist(path, c = 1):

        for i in glob.glob(os.path.join(path, "*")):
                if os.path.isfile(i):
                        filepath, filename = os.path.split(i)
                        print '----' *c + filename

                elif os.path.isdir(i):
                        dirname = os.path.basename(i)
                        print '----' *c + dirname
                        c+=1
                        dirlist(i,c)
                        c-=1


path = os.path.normpath(sys.argv[1])
print(os.path.basename(path))
dirlist(path)

2

এটি একটি fnmatch বা নিয়মিত অভিব্যক্তি ব্যবহার করে:

import fnmatch, os

def filepaths(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for basename in files:
            try:
                matched = pattern.match(basename)
            except AttributeError:
                matched = fnmatch.fnmatch(basename, pattern)
            if matched:
                yield os.path.join(root, basename)

# usage
if __name__ == '__main__':
    from pprint import pprint as pp
    import re
    path = r'/Users/hipertracker/app/myapp'
    pp([x for x in filepaths(path, re.compile(r'.*\.py$'))])
    pp([x for x in filepaths(path, '*.py')])

2

প্রস্তাবিত উত্তরের পাশাপাশি আপনি কিছু অলস প্রজন্ম এবং তালিকা বোঝার যাদুতে এটি করতে পারেন:

import os, glob, itertools

results = itertools.chain.from_iterable(glob.iglob(os.path.join(root,'*.c'))
                                               for root, dirs, files in os.walk('src'))

for f in results: print(f)

এক লাইনে ফিট করা এবং মেমোরিতে অপ্রয়োজনীয় তালিকা এড়ানো ছাড়াও, এর দুর্দান্ত পার্শ্ব প্রতিক্রিয়াও রয়েছে, আপনি এটি ** অপারেটরের মতো উপায়ে ব্যবহার করতে পারেন, উদাহরণস্বরূপ, os.path.join(root, 'some/path/*.c')সমস্ত .c ফাইল সমস্ত ক্ষেত্রে পেতে আপনি ব্যবহার করতে পারেন এসআরসি-র সাব ডিরেক্টরিগুলি যা এই কাঠামোটি রয়েছে।


2

অজগর জন্য 3.5 এবং পরবর্তী

import glob

#file_names_array = glob.glob('path/*.c', recursive=True)
#above works for files directly at path/ as guided by NeStack

#updated version
file_names_array = glob.glob('path/**/*.c', recursive=True)

আরও আপনার প্রয়োজন হতে পারে

for full_path_in_src in  file_names_array:
    print (full_path_in_src ) # be like 'abc/xyz.c'
    #Full system path of this would be like => 'path till src/abc/xyz.c'

3
আপনার প্রথম লাইনের কোড সাব-ডিরেক্টরিতে সন্ধানের জন্য কাজ করে না। তবে আপনি যদি এটির দ্বারা /**এটি কেবল প্রসারিত করেন তবে এটি আমার জন্য কাজ করে:file_names_array = glob.glob('src/**/*.c', recursive=True)
নেস্ট্যাক

2

এটি পাইথন ২.7 এ একটি কার্যকারী কোড is আমার ডিভস কাজের অংশ হিসাবে, আমাকে একটি স্ক্রিপ্ট লিখতে হয়েছিল যা live-appName.properties দ্বারা চিহ্নিত কনফিগার ফাইলগুলিকে appName.properties এ সরিয়ে দেবে। লাইভ- appName.xML এর মতো অন্যান্য এক্সটেনশন ফাইলগুলিও থাকতে পারে।

নীচে এটির জন্য একটি কার্যকরী কোড দেওয়া হয়েছে, যা প্রদত্ত ডিরেক্টরিগুলিতে (নেস্টেড স্তর) ফাইলগুলি সন্ধান করে এবং তারপরে পুনরায় নাম পরিবর্তন করে (প্রয়োজনীয় স্থানান্তরিত করে)

def flipProperties(searchDir):
   print "Flipping properties to point to live DB"
   for root, dirnames, filenames in os.walk(searchDir):
      for filename in fnmatch.filter(filenames, 'live-*.*'):
        targetFileName = os.path.join(root, filename.split("live-")[1])
        print "File "+ os.path.join(root, filename) + "will be moved to " + targetFileName
        shutil.move(os.path.join(root, filename), targetFileName)

এই ফাংশনটি একটি প্রধান স্ক্রিপ্ট থেকে কল করা হয়

flipProperties(searchDir)

আশা করি এটি কাউকে অনুরূপ সমস্যার সাথে লড়াইয়ে সহায়তা করবে।



1

ডিরেক্টরি এবং সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে একাধিক ফাইল এক্সটেনশানগুলি অনুসন্ধান করতে তালিকা বোধগম্যতা ব্যবহার করে আমার সমাধানটি এখানে দেওয়া হয়েছে :

import os, glob

def _globrec(path, *exts):
""" Glob recursively a directory and all subdirectories for multiple file extensions 
    Note: Glob is case-insensitive, i. e. for '\*.jpg' you will get files ending
    with .jpg and .JPG

    Parameters
    ----------
    path : str
        A directory name
    exts : tuple
        File extensions to glob for

    Returns
    -------
    files : list
        list of files matching extensions in exts in path and subfolders

    """
    dirs = [a[0] for a in os.walk(path)]
    f_filter = [d+e for d in dirs for e in exts]    
    return [f for files in [glob.iglob(files) for files in f_filter] for f in files]

my_pictures = _globrec(r'C:\Temp', '\*.jpg','\*.bmp','\*.png','\*.gif')
for f in my_pictures:
    print f

0
import sys, os, glob

dir_list = ["c:\\books\\heap"]

while len(dir_list) > 0:
    cur_dir = dir_list[0]
    del dir_list[0]
    list_of_files = glob.glob(cur_dir+'\\*')
    for book in list_of_files:
        if os.path.isfile(book):
            print(book)
        else:
            dir_list.append(book)

0

আমি এই পোস্টিংয়ের শীর্ষের উত্তরটি পরিবর্তন করেছি .. এবং সম্প্রতি এই স্ক্রিপ্টটি তৈরি করেছি যা প্রদত্ত ডিরেক্টরিতে (সার্চডির) সমস্ত ফাইল এবং এর অধীনে উপ-ডিরেক্টরিগুলি লুপ করবে ... এবং ফাইলের নাম, রুটডির, পরিবর্তিত / তৈরি তারিখ এবং মুদ্রণ করবে এবং আকার।

আশা করি এটি কারও সহায়তা করে ... এবং তারা ডিরেক্টরিটি চালাতে এবং ফাইল ইনফো পেতে পারে।

import time
import fnmatch
import os

def fileinfo(file):
    filename = os.path.basename(file)
    rootdir = os.path.dirname(file)
    lastmod = time.ctime(os.path.getmtime(file))
    creation = time.ctime(os.path.getctime(file))
    filesize = os.path.getsize(file)

    print "%s**\t%s\t%s\t%s\t%s" % (rootdir, filename, lastmod, creation, filesize)

searchdir = r'D:\Your\Directory\Root'
matches = []

for root, dirnames, filenames in os.walk(searchdir):
    ##  for filename in fnmatch.filter(filenames, '*.c'):
    for filename in filenames:
        ##      matches.append(os.path.join(root, filename))
        ##print matches
        fileinfo(os.path.join(root, filename))

0

এখানে একটি সমাধান রয়েছে যা পুরো পথের সাথে প্যাটার্নটি মেলে এবং কেবলমাত্র বেস ফাইলের নাম নয়।

এটি fnmatch.translateএকটি গ্লোব-স্টাইলের প্যাটার্নটিকে নিয়মিত অভিব্যক্তিতে রূপান্তর করতে ব্যবহার করে, যা ডিরেক্টরিতে চলার সময় পাওয়া প্রতিটি ফাইলের পুরো পাথের সাথে মিলে যায়।

re.IGNORECASEউইন্ডোজ isচ্ছিক, তবে ফাইল সিস্টেম নিজেই কেস-সংবেদনশীল নয় বলে উইন্ডোজে আকাঙ্ক্ষিত। (আমি রেজেক্সকে সংকলন করতে বিরক্ত করিনি কারণ ডক্স সূচিত করে যে এটি অভ্যন্তরীণভাবে ক্যাশে করা উচিত))

import fnmatch
import os
import re

def findfiles(dir, pattern):
    patternregex = fnmatch.translate(pattern)
    for root, dirs, files in os.walk(dir):
        for basename in files:
            filename = os.path.join(root, basename)
            if re.search(patternregex, filename, re.IGNORECASE):
                yield filename

0

পাইথন ২.x এর জন্য আমার একটি সমাধান দরকার যা বড় ডিরেক্টরিতে দ্রুত কাজ করে।
আমি এটি দিয়ে শেষ:

import subprocess
foundfiles= subprocess.check_output("ls src/*.c src/**/*.c", shell=True)
for foundfile in foundfiles.splitlines():
    print foundfile

নোট করুন যে lsকোনও ম্যাচিং ফাইল খুঁজে না পাওয়ার ক্ষেত্রে আপনার কিছু ব্যতিক্রম হ্যান্ডলিংয়ের প্রয়োজন হতে পারে ।


আমি কেবল বুঝতে পেরেছি যে ls src/**/*.cকেবলমাত্র গ্লোবস্টার বিকল্পটি সক্ষম করা থাকলেই কার্যকর হয় ( shopt -s globstar) - বিশদ বিবরণের জন্য এই উত্তরটি দেখুন।
রোমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.