Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

pathlib.Path.rglob

Sử dụng

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
6 từ mô -đun
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
7, được giới thiệu trong Python 3.5.

from pathlib import Path

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

Nếu bạn không muốn sử dụng pathlib, sử dụng có thể sử dụng

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
8, nhưng đừng quên vượt qua tham số từ khóa
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
9 và nó sẽ sử dụng khoảng thời gian không phù hợp cho các thư mục lớn.

Cho các trường hợp các tệp khớp bắt đầu bằng một dấu chấm (

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
0); Giống như các tệp trong thư mục hiện tại hoặc các tệp ẩn trên hệ thống dựa trên UNIX, hãy sử dụng giải pháp
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
1 bên dưới.

os.walk

Đối với các phiên bản Python cũ hơn, hãy sử dụng

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
1 để đi bộ một cách đệ quy một thư mục và
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
3 để khớp với một biểu thức đơn giản:

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))

Đã trả lời ngày 2 tháng 2 năm 2010 lúc 18:26Feb 2, 2010 at 18:26

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Johan Dahlinjohan DahlinJohan Dahlin

24.1k6 Huy hiệu vàng40 Huy hiệu bạc52 Huy hiệu đồng6 gold badges40 silver badges52 bronze badges

13

Đối với Python> = 3.5, bạn có thể sử dụng

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
4,
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
5:

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

Nếu đệ quy là

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
6, mẫu
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
4 sẽ khớp với bất kỳ tệp nào và không hoặc nhiều hoặc nhiều hơn
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
8 và
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9. Nếu mẫu được theo sau bởi một
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
0, chỉ có các thư mục và
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9.will match any files and zero or more
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
8 and
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9
. If the pattern is followed by an
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
0, only directories and
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9 match.


Python 3.6 Bản demo

Đã trả lời ngày 25 tháng 8 năm 2019 lúc 9:45Aug 25, 2019 at 9:45

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Pedro lobitopedro lobitoPedro Lobito

88.9K30 Huy hiệu vàng239 Huy hiệu bạc257 Huy hiệu Đồng30 gold badges239 silver badges257 bronze badges

3

Tương tự như các giải pháp khác, nhưng sử dụng fnmatch.fnmatch thay vì glob, vì os.walk đã liệt kê các tên tệp:

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

Ngoài ra, sử dụng một trình tạo làm cho bạn xử lý từng tệp như được tìm thấy, thay vì tìm tất cả các tệp và sau đó xử lý chúng.

Johan Dahlin

24.1k6 Huy hiệu vàng40 Huy hiệu bạc52 Huy hiệu đồng6 gold badges40 silver badges52 bronze badges

Đối với Python> = 3.5, bạn có thể sử dụng

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
4,
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
5:Feb 2, 2010 at 18:44

Nếu đệ quy là

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
6, mẫu
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
4 sẽ khớp với bất kỳ tệp nào và không hoặc nhiều hoặc nhiều hơn
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
8 và
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9. Nếu mẫu được theo sau bởi một
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
0, chỉ có các thư mục và
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
9.Bruno Oliveira

Python 3.6 Bản demo4 gold badges41 silver badges39 bronze badges

0

Đã trả lời ngày 25 tháng 8 năm 2019 lúc 9:45

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

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

Pedro lobitopedro lobito

88.9K30 Huy hiệu vàng239 Huy hiệu bạc257 Huy hiệu Đồng

Tương tự như các giải pháp khác, nhưng sử dụng fnmatch.fnmatch thay vì glob, vì os.walk đã liệt kê các tên tệp:26 gold badges149 silver badges179 bronze badges

Ngoài ra, sử dụng một trình tạo làm cho bạn xử lý từng tệp như được tìm thấy, thay vì tìm tất cả các tệp và sau đó xử lý chúng.Jun 26, 2011 at 14:14

4

Johan Dahlin

from pathlib import Path

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

Đã trả lời ngày 2 tháng 2 năm 2010 lúc 18:44 Starting with Python 3.5, the same syntax is also supported by

from pathlib import Path

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

Bruno Oliveirabruno OliveiraNov 11, 2014 at 16:08

12.4K4 Huy hiệu vàng41 Huy hiệu bạc39 Huy hiệu đồngtaleinat

Tôi đã sửa đổi mô -đun GLOB để hỗ trợ ** cho Globbing đệ quy, ví dụ:1 gold badge29 silver badges42 bronze badges

3

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

Hữu ích khi bạn muốn cung cấp cho người dùng của mình khả năng sử dụng cú pháp ** và do đó chỉ riêng Os.Walk () không đủ tốt.

MattFeb 2, 2010 at 18:39

73.2K26 Huy hiệu vàng149 Huy hiệu bạc179 Huy hiệu đồngAlex Martelli

Đã trả lời ngày 26 tháng 6 năm 2011 lúc 14:14163 gold badges1203 silver badges1382 bronze badges

2

Bắt đầu với Python 3.4, người ta có thể sử dụng phương pháp

from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
2 của một trong các lớp
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
3 trong mô -đun Pathlib mới, hỗ trợ các ký tự đại diện
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
4. Ví dụ:

Cập nhật: Bắt đầu với Python 3.5, cú pháp tương tự cũng được hỗ trợ bởi
from pathlib import Path

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

Đã trả lời ngày 11 tháng 11 năm 2014 lúc 16:08Feb 2, 2010 at 18:24

TaleinattaleinatGeoff Reedy

8.2111 Huy hiệu vàng29 Huy hiệu bạc42 Huy hiệu đồng3 gold badges54 silver badges77 bronze badges

from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
6 cung cấp cho bạn chính xác các mẫu giống như
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
7, vì vậy đây thực sự là một sự thay thế tuyệt vời cho
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
8 với ngữ nghĩa rất gần. Một phiên bản lặp (ví dụ: một trình tạo), IOW thay thế cho
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
9, là một sự thích ứng tầm thường (chỉ
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
0 kết quả trung gian khi bạn đi, thay vì
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
1 về một danh sách kết quả duy nhất để trả về ở cuối).

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

Đã trả lời ngày 2 tháng 2 năm 2010 lúc 18:39

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

Alex Martellialex Martelli

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))
0

826K163 Huy hiệu vàng1203 Huy hiệu bạc1382 Huy hiệu Đồng

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))
1

Bạn sẽ muốn sử dụng

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
1 để thu thập các tên tệp phù hợp với tiêu chí của bạn. Ví dụ:

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))
4 gold badges75 silver badges71 bronze badges

Đã trả lời ngày 2 tháng 2 năm 2010 lúc 18:24Nov 2, 2011 at 8:10

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Geoff Reedygeoff Reedyakaihola

33,9K3 Huy hiệu vàng54 Huy hiệu bạc77 Huy hiệu đồng6 gold badges59 silver badges67 bronze badges

Dưới đây là một giải pháp với sự hiểu biết danh sách lồng nhau,

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
1 và kết hợp hậu tố đơn giản thay vì
from pathlib import Path

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

Nó có thể được nén thành một lớp lót:

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))
2

hoặc tổng quát như một chức năng:

Nếu bạn cần các mẫu kiểu

from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
7 đầy đủ, bạn có thể theo dõi ví dụ của Alex và Bruno và sử dụng
from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files
6:May 23, 2019 at 12:11

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

blueyedpylang

26,5K4 Huy hiệu vàng75 Huy hiệu bạc71 Huy hiệu đồng11 gold badges121 silver badges112 bronze badges

0

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
  • Đã trả lời ngày 2 tháng 11 năm 2011 lúc 8:10
  • Akaiholaakaihola
  • 25.8K6 Huy hiệu vàng59 Huy hiệu bạc67 Huy hiệu Đồng
  • Hãy xem xét
    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
    
    7.
  • Điều này giống như gọi
    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
    
    8 với
    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
    
    9 được thêm vào trước mẫu tương đối đã cho:
  • Xem thêm Bài đăng liên quan của @Taleinat ở đây và một bài đăng tương tự ở nơi khác.

Đã trả lời ngày 23 tháng 5 năm 2019 lúc 12:11Aug 3, 2020 at 5:10

Pylangpylang

36,5K11 Huy hiệu vàng121 Huy hiệu bạc112 Huy hiệu đồng

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))
4

________ 70: Phù hợp với tất cả các tệp kết thúc trong

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))
1 trong thư mục hiện tại
os_walk: ~3.6sec
rglob ~14.5sec
iglob: ~16.9sec

________ 72: Giống như 1

________ 73: khớp với tất cả các tệp kết thúc trong

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))
1 chỉ trong các thư mục con ngay lập tức, nhưng không phải trong thư mục hiện tạiJun 13, 2020 at 17:39

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))
5: Giống như 1Daniel

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))
6: Giống như 313 silver badges19 bronze badges

1

________ 77: khớp với tất cả các tệp kết thúc trong

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))
1 trong thư mục hiện tại và trong tất cả các thư mục con

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))
5

mmmmmm

31.7K27 Huy hiệu vàng88 Huy hiệu bạc114 Huy hiệu đồng27 gold badges88 silver badges114 bronze badges

Đã trả lời ngày 5 tháng 1 năm 2013 lúc 10:36Jan 5, 2013 at 10:36

Dựa trên các câu trả lời khác, đây là triển khai làm việc hiện tại của tôi, trong đó truy xuất các tệp XML lồng nhau trong thư mục gốc:

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))
6

Tôi thực sự vui vẻ với Python :)

Đã trả lời ngày 28 tháng 7 năm 2012 lúc 22:09Jul 28, 2012 at 22:09

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Daveoncodedaveoncodedaveoncode

18.1K14 Huy hiệu vàng98 Huy hiệu bạc156 Huy hiệu đồng14 gold badges98 silver badges156 bronze badges

Johan và Bruno cung cấp các giải pháp tuyệt vời về yêu cầu tối thiểu như đã nêu. Tôi vừa phát hành Formic, trong đó thực hiện các tập tin Ant và Globs có thể xử lý các kịch bản này và phức tạp hơn. Việc thực hiện yêu cầu của bạn là:

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))
7

Đã trả lời ngày 15 tháng 5 năm 2012 lúc 8:53May 15, 2012 at 8:53

Andrew Alcockandrew AlcockAndrew Alcock

Phim thương hiệu vàng 19.2k44 gold badges41 silver badges60 bronze badges

1

Cho Python 3.5 trở lên

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))
8

Hơn nữa bạn có thể cần

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))
9

Đã trả lời ngày 21 tháng 6 năm 2019 lúc 21:08Jun 21, 2019 at 21:08

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

SamisamiSami

7.9748 Huy hiệu vàng66 Huy hiệu bạc95 Huy hiệu Đồng8 gold badges66 silver badges95 bronze badges

1

Một cách khác để làm điều đó chỉ bằng mô -đun GLOB. Chỉ cần tạo ra phương thức RGLOB với thư mục cơ sở bắt đầu và một mẫu để khớp và nó sẽ trả về một danh sách các tên tệp phù hợp.

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

Đã trả lời ngày 13 tháng 9 năm 2011 lúc 22:59Sep 13, 2011 at 22:59

Hoặc với một danh sách hiểu:

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

Đã trả lời ngày 24 tháng 6 năm 2013 lúc 10:41Jun 24, 2013 at 10:41

Xtoflxtoflxtofl

40K12 Huy hiệu vàng101 Huy hiệu bạc190 Huy hiệu Đồng12 gold badges101 silver badges190 bronze badges

Nếu các tệp nằm trên một hệ thống tệp từ xa hoặc bên trong kho lưu trữ, bạn có thể sử dụng một triển khai của lớp FSSPEC Enterrologfilesystem. Ví dụ: để liệt kê tất cả các tệp trong zipfile:remote file system or inside an archive, you can use an implementation of the fsspec AbstractFileSystem class. For example, to list all the files in a zipfile:

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

hoặc để liệt kê tất cả các tệp trong nhóm S3 có sẵn công khai:

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

Bạn cũng có thể sử dụng nó cho một hệ thống tập tin cục bộ, điều này có thể rất thú vị nếu việc triển khai của bạn phải là hệ thống tập tin-agnostic:

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

Các triển khai khác bao gồm Google Cloud, GitHub, SFTP/SSH, Dropbox và Azure. Để biết chi tiết, xem tài liệu API FSSPEC.

Đã trả lời ngày 8 tháng 10 năm 2020 lúc 13:49Oct 8, 2020 at 13:49

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Gerritgerritgerrit

21.8K16 Huy hiệu vàng89 Huy hiệu bạc164 Huy hiệu đồng16 gold badges89 silver badges164 bronze badges

Chỉ cần thực hiện cái này .. nó sẽ in các tệp và thư mục theo cách phân cấp

Nhưng tôi đã không sử dụng fnmatch hoặc đi bộ

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

Đã trả lời ngày 27 tháng 7 năm 2013 lúc 18:12Jul 27, 2013 at 18:12

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

Shaurya Guptashaurya GuptaShaurya Gupta

5291 Huy hiệu vàng4 Huy hiệu bạc 6 Huy hiệu Đồng1 gold badge4 silver badges6 bronze badges

Mà người ta sử dụng fnmatch hoặc biểu thức chính quy:

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

Đã trả lời ngày 2 tháng 8 năm 2013 lúc 16:01Aug 2, 2013 at 16:01

Hipertrackerhipertrackerhipertracker

2.34624 Huy hiệu bạc14 Huy hiệu đồng24 silver badges14 bronze badges

Ngoài các câu trả lời được đề xuất, bạn có thể thực hiện điều này với một số thế hệ lười biếng và phép thuật hiểu danh sách:

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

Bên cạnh việc lắp một dòng và tránh các danh sách không cần thiết trong bộ nhớ, điều này cũng có tác dụng phụ tốt đẹp, bạn có thể sử dụng nó theo cách tương tự như toán tử **, ví dụ: bạn có thể sử dụng

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))
9 để có được tất cả các tệp .c trong Tất cả các thư mục phụ của SRC có cấu trúc này.

Đã trả lời ngày 5 tháng 12 năm 2015 lúc 17:42Dec 5, 2015 at 17:42

Hướng dẫn python find all files with extension recursively - python tìm tất cả các tệp có phần mở rộng một cách đệ quy

f0xdxf0xdxf0xdx

1.27915 huy hiệu bạc19 Huy hiệu đồng15 silver badges19 bronze badges

Đây là một mã làm việc trên Python 2.7. Là một phần của công việc DevOps của tôi, tôi được yêu cầu viết một tập lệnh sẽ chuyển các tệp cấu hình được đánh dấu bằng ứng dụng trực tiếp.properies sang appName.properies. Có thể có các tệp tiện ích mở rộng khác cũng như ứng dụng trực tiếp.xml.

Dưới đây là mã làm việc cho việc này, tìm thấy các tệp trong các thư mục đã cho (mức lồng nhau) và sau đó đổi tên (di chuyển) nó thành tên tệp cần thiết

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

Hàm này được gọi từ một tập lệnh chính

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

Hy vọng điều này giúp ai đó đấu tranh với các vấn đề tương tự.

Đã trả lời ngày 3 tháng 4 năm 2020 lúc 10:03Apr 3, 2020 at 10:03

Phiên bản đơn giản hóa câu trả lời của Johan Dahlin, không có fnmatch.

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
0

Đã trả lời ngày 3 tháng 6 năm 2013 lúc 1:29Jun 3, 2013 at 1:29

Flowfreeflowfreeflowfree

16.1K12 Huy hiệu vàng49 Huy hiệu bạc76 Huy hiệu đồng12 gold badges49 silver badges76 bronze badges

Dưới đây là giải pháp của tôi bằng cách sử dụng danh sách hiểu để tìm kiếm nhiều phần mở rộng tệp một cách đệ quy trong một thư mục và tất cả các thư mục con:multiple file extensions recursively in a directory and all subdirectories:

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
1

Đã trả lời ngày 18 tháng 8 năm 2014 lúc 17:50Aug 18, 2014 at 17:50

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
2

Đã trả lời ngày 27 tháng 1 năm 2014 lúc 19:03Jan 27, 2014 at 19:03

Tôi đã sửa đổi câu trả lời hàng đầu trong bài đăng này .. và gần đây đã tạo tập lệnh này sẽ lặp qua tất cả các tệp trong một thư mục nhất định (searchDir) và các thư mục phụ theo nó ... và in tên tệp, rootDir, ngày sửa đổi/tạo và ngày tạo và kích thước.

Hy vọng điều này sẽ giúp ai đó ... và họ có thể đi bộ thư mục và nhận FileInfo.

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

Đã trả lời ngày 15 tháng 11 năm 2014 lúc 13:39Nov 15, 2014 at 13:39

Ihightowerihightowerihightower

2.9106 Huy hiệu vàng32 Huy hiệu bạc48 Huy hiệu Đồng6 gold badges32 silver badges48 bronze badges

Dưới đây là một giải pháp sẽ phù hợp với mẫu so với đường dẫn đầy đủ và không chỉ tên tệp cơ sở.

Nó sử dụng

import os
cfiles = [os.path.join(root, filename)
          for root, dirnames, filenames in os.walk('src')
          for filename in filenames if filename.endswith('.c')]
0 để chuyển đổi mẫu kiểu cầu thành biểu thức chính quy, sau đó được khớp với đường dẫn đầy đủ của mỗi tệp được tìm thấy trong khi đi bộ thư mục.

import os
cfiles = [os.path.join(root, filename)
          for root, dirnames, filenames in os.walk('src')
          for filename in filenames if filename.endswith('.c')]
1 là tùy chọn, nhưng mong muốn trên Windows vì bản thân hệ thống tệp không nhạy cảm với trường hợp. .

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
4

Đã trả lời ngày 30 tháng 6 năm 2015 lúc 15:39Jun 30, 2015 at 15:39

Yoyoyoyoyo

7.8504 Huy hiệu vàng54 Huy hiệu bạc48 Huy hiệu đồng4 gold badges54 silver badges48 bronze badges

Tôi cần một giải pháp cho Python 2.x hoạt động nhanh trên các thư mục lớn. Tôi bắt đầu với điều này:python 2.x that works fast on large directories.
I endet up with this:

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
5

Lưu ý rằng bạn có thể cần một số xử lý ngoại lệ trong trường hợp

import os
cfiles = [os.path.join(root, filename)
          for root, dirnames, filenames in os.walk('src')
          for filename in filenames if filename.endswith('.c')]
2 không tìm thấy bất kỳ tệp phù hợp nào.

Đã trả lời ngày 23 tháng 6 năm 2017 lúc 10:20Jun 23, 2017 at 10:20

RomanromanRoman

6778 Huy hiệu bạc16 Huy hiệu Đồng8 silver badges16 bronze badges

3

Làm cách nào để thấy tất cả các phần mở rộng tệp trong Python?

Sử dụng mô -đun GLOB, bạn có thể tìm kiếm các tệp với các tiện ích mở rộng nhất định ...
hệ điều hành. CHDIR ("my_dir") đặt thư mục làm việc hiện tại thành /my_dir ..
Sử dụng một vòng lặp For, bạn có thể tìm kiếm các tệp với. TXT Tiện ích mở rộng sử dụng GLOB () ..
* Biểu thị tất cả các tệp với một tiện ích mở rộng nhất định ..

Làm thế nào để bạn liệt kê tất cả các tệp trong một thư mục với một tiện ích mở rộng nhất định trong Python?

Phương thức Os.ListDir () liệt kê tất cả các tệp có trong một thư mục.Chúng ta có thể sử dụng hệ điều hành.đi bộ () nếu chúng tôi cũng muốn làm việc với các hướng dẫn phụ.os. listdir() lists all the files present in a directory. We can make use of os. walk() if we want to work with sub-directories as well.

Làm cách nào để sử dụng GLOB để tìm các tệp đệ quy?

Chúng ta có thể sử dụng hàm glob.glob () hoặc glob.iglob () trực tiếp từ mô -đun GLOB để truy xuất các đường dẫn đệ quy từ bên trong các thư mục/tệp và thư mục con/phụ.Lưu ý: Khi đệ quy được đặt đúng, **, theo sau là bộ phân cách đường dẫn ('./**/') sẽ phù hợp với bất kỳ tệp hoặc thư mục nào.use the function glob. glob() or glob. iglob() directly from glob module to retrieve paths recursively from inside the directories/files and subdirectories/subfiles. Note: When recursive is set True “ ** ” followed by path separator ('./**/') will match any files or directories.

Làm cách nào để sử dụng .glob trong Python?

Phương thức python glob () để tìm kiếm các tệp mà chúng ta cần nhập mô-đun toàn cầu tích hợp của Python để sử dụng hàm glob ().Python Glob.Phương thức glob () trả về danh sách các tệp hoặc thư mục phù hợp với đường dẫn được chỉ định trong đối số tên đường dẫn.Hàm này có hai đối số, cụ thể là tên đường dẫn và cờ đệ quy.import Python's built-in glob module to use the glob() function. Python glob. glob() method returns a list of files or folders that matches the path specified in the pathname argument. This function takes two arguments, namely pathname, and recursive flag.