Pythonda recursively faylları axtarmaq üçün glob () istifadə edin?

Budur mənim var:

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

lakin src alt klasörleri aramak istiyorum. Bu kimi bir şey işləyəcək:

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

Ancaq açıqca məhdud və narahat.

427
02 февр. Ben Gartner 02 fevral tarixini təyin etdi. 2010-02-02 21:19 '10 at 21:19 2010-02-02 21:19
ответ 21 cavab

Python 3.5 +

Python üçün versiya 3.5 ilə başlayaraq, glob "**" direktivini dəstəkləyir (yalnız recursive bayraqdan recursive təhlil edilir):

 import glob for filename in glob.iglob('src*.c', recursive=True): print(filename) 

Bir siyahıya ehtiyacınız varsa glob.glob yerinə glob.glob istifadə edin.

Uyğun faylların bir nöqtə ilə başlayan hallarda (.); Unix əsaslı bir sistemdə cari kataloq və ya gizli fayllardakı fayllar kimi aşağıda os.walk istifadə edin.

Python 2.2 - 3.4

Python'un əvvəlki versiyaları üçün, Python 2.2 ilə başlayaraq, os.walk istifadə os.walk , os.walkfnmatch.filter i sadə ifadə ilə uyğunlaşdırmaq üçün 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)) 

Python 2.1 və əvvəllər

Pythonun köhnə versiyaları üçün, fnmatch.filter əvəzinə hər bir fayl adı üçün glob.glob istifadə edin.

833
02 февр. Johan Dahlin tərəfindən verilmiş cavab 02 fevral. 2010-02-02 21:26 '10 at 21:26 2010-02-02 21:26

Digər həllər kimi, ancaq fnmatch.fnmatch istifadə glob deyil, çünki os.walk artıq fayl adları siyahıları:

 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 
border=0

Həmçinin, generatordan istifadə edərək, hər bir faylın tapıldığı kimi, bütün faylları tapmaq və daha sonra işlədilməməsi yerinə yetirilməlidir.

90
02 февр. Cavab Bruno Oliveira tərəfindən verilmişdir 02 fevral. 2010-02-02 21:44 '10 at 21:44 2010-02-02 21:44

Məsələn, recursive globbing-in dəstəklənməsi üçün glob modulunu dəyişdirdim:

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

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

Faydalı istifadəçilərinizə sintaksis istifadə etmək imkanı vermək istəsəniz **, os.walk () kifayət qədər yaxşı deyil.

43
26 июня '11 в 17:14 2011-06-26 17:14 cavab 26 iyun 'da 17:14' də möcüzə2k tərəfindən verilmişdir 2011-06-26 17:14

Python 3.4-də başlayaraq, ** joker kartları dəstəkləyən yeni pathlib-Path dərslərindən birinin glob glob() metodundan istifadə edə bilərsiniz. Məsələn:

5
15 мая '12 в 11:53 2012-05-15 11:53 cavab 15 may 2012-ci il saat 11:53 radələrində Andrew Alcock tərəfindən verilir. 2012-05-15 11:53

Son zamanlarda mənim fotoşəkillərimi uzantı ilə bərpa etdim. Jpg. Bir fotorec qaçdım və içərisində 2,2 milyon faylın 4579 qovluqunu bərpa etdim. Aşağıdakı skript ilə, dəqiqə ərzində 50133 fayl havin.jpg uzantısını seçə bildim:

 #!/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) 
5
05 янв. Mustafa Jetin tərəfindən verilmiş cavab 05 Yanvar 2013-01-05 13:36 '13 da 13:36 2013-01-05 13:36

Bunu etmək üçün başqa bir yol yalnız glob modülünü istifadə edir. Yalnızca rglob metodunu uyğunlaşdırmaq üçün mənbə bazası qovluğu və desenlə işləyin və uyğun fayl adlarının siyahısını qaytarır.

 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 
3
14 сент. Cavab 14 sentyabrda Chris-piekarski tərəfindən verilir . 2011-09-14 01:59 '11 'də 1:59' də 2011-09-14 01:59

Təklif olunan cavablara əlavə olaraq, bunu tənbəl nəsil və siyahı anlayışının sehr yolu ilə edə bilərsiniz:

 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) 

Bir xətt yaradılması və yaddaşda lazımsız siyahıları aradan qaldırmaqla yanaşı, yaxşı bir yan təsiri var, bu da ** operator kimi istifadə edə bilərsiniz, məsələn os.path.join(root, 'some/path*.c", shell=True) for foundfile in foundfiles.splitlines(): print foundfile

ls müvafiq fayl ls , bəzi istisnalara ehtiyacınız ola bilər.

0
23 июня '17 в 13:20 2017-06-23 13:20 Cavab 23 İyun Roman 'da verilir , '17 saat 13:20' də 2017-06-23 13:20

Şablonu yalnız əsas fayl adına deyil, tam yola uyğun bir həll.

fnmatch.translate stil modelini müntəzəm ifadəyə çevirmək üçün fnmatch.translate istifadə edir, daha sonra kataloqu gediş zamanı tapılan hər bir faylın tam yolu ilə eşleşir.

re.IGNORECASE isteğe bağlıdır, lakin Windows üçün arzu edilir, çünki fayl sistemi özü halda həssas deyil. (Mən sənədləri məcburi qaydada tərtib etmək istəmədim, çünki sənədlər daxili saxlanılmalıdır.)

 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
30 июня '15 в 18:39 2015-06-30 18:39 Cavab yoyo 30 iyun, saat 15: 00-da verilir. 2015-06-30 18:39
 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
27 янв. Cavab verilir serega386 27 yanvar. 2014-01-27 22:03 '14 saat 10:03 'da 2014-01-27 22:03

Tags haqqında suallar və ya bir sual