Как использовать glob () для рекурсивного поиска файлов?

В других предложениях (я недостаточно авторитет, чтобы комментировать, извините!), вы можете попробовать плагин TableSorter для обработки только отображения полезного количества данных за раз.

Я не знаю, как это работает при очень большом количестве строк, но их пример данных составляет 1000 строк или около того.

Это не помогло бы с JS-производительностью, но сохранит нагрузку с браузера.

625
задан fish2000 20 March 2019 в 00:35
поделиться

5 ответов

Python 3.5+

Так как вы находитесь на новом питоне, вы должны использовать pathlib.Path.rglob из pathlib модуля.

from pathlib import Path

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

Если вы не хотите использовать путь, просто используйте glob.glob, но не забудьте пройти в параметре ключевого слова recursive.

Для случаев, когда совпадают файлы, начинающиеся с точки (...); например, файлы в текущем каталоге или скрытые файлы в системе на базе Unix, используйте решение os.walk ниже.

Старые версии Python

Для старых версий Python используйте 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))
1248
ответ дан 22 November 2019 в 21:42
поделиться

Для Python> = 3.5 можно использовать **, recursive=True:

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

Демонстрация

<час>

, Если рекурсивный верна, шаблон ** будет соответствовать любым файлам и нуль или больше directories и subdirectories. Если шаблон сопровождается os.sep, только каталоги и subdirectories соответствие.

5
ответ дан 22 November 2019 в 21:42
поделиться

Вы захотите использовать 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))
20
ответ дан 22 November 2019 в 21:42
поделиться

, аналогично другим решениям, Но используя fnmatch.fnmatch вместо chob, поскольку 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

также, использование генератора предупреждает вас, чтобы обработать каждый файл, как он найден, вместо того, чтобы найти все файлы , а затем Обработка их.

107
ответ дан 22 November 2019 в 21:42
поделиться
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 с очень близкая семантика. Итерационная версия (например, генератор), IOW вместо glob.iglob , представляет собой тривиальную адаптацию (просто выдают промежуточные результаты по ходу, вместо расширять с одним списком результатов для возврата в конце).

39
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: