Python 3.5+
Поскольку вы находитесь на новом питоне, вы должны использовать pathlib.Path.rglob
из pathlib
модуля.
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Если вы не хотите использовать pathlib, просто используйте 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))
os.path.walk()
что-то более удобное в использовании, чемos.walk()
os.path.walk()
он устарел и был удален в Python 3.pathlib.Path('src').glob('**/*.c')
должно работать.Как и в других решениях, но с использованием fnmatch.fnmatch вместо glob, так как os.walk уже перечислил имена файлов:
Кроме того, использование генератора позволяет обрабатывать каждый файл так, как он был найден, вместо того, чтобы находить все файлы и затем обрабатывать их.
источник
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')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Я изменил модуль glob для поддержки ** для рекурсивного сглаживания, например:
https://github.com/miracle2k/python-glob2/
Полезно, когда вы хотите предоставить своим пользователям возможность использовать синтаксис **, и, таким образом, одного os.walk () недостаточно.
источник
**
с помощью официального модуля glob, выполните:glob(path, recursive=True)
Начиная с Python 3.4, можно использовать
glob()
метод одного изPath
классов в новом модуле pathlib , который поддерживает**
подстановочные знаки. Например:Обновление: Начиная с Python 3.5, тот же синтаксис также поддерживается
glob.glob()
.источник
fnmatch
дает вам точно такие же шаблоны, какglob
, так что это действительно отличная заменаglob.glob
с очень близкой семантикой. Итеративная версия (например, генератор), IOW заменойglob.iglob
, является тривиальной адаптацией (простоyield
промежуточные результаты по ходу, вместо того, чтобыextend
создавать единый список результатов для возврата в конце).источник
recursive_glob(pattern, treeroot='.')
как я предложил в моем редактировании? Таким образом, его можно вызвать, например, какrecursive_glob('*.txt')
и интуитивно соответствовать синтаксисуglob
.fnmatch.filter
, что примерно так же полезно, как и возможность сопоставления с одним аргументомglob.glob
.Для питона> = 3,5 вы можете использовать
**
,recursive=True
:демонстрация
источник
Вы хотите использовать
os.walk
для сбора имен файлов, которые соответствуют вашим критериям. Например:источник
Вот решение с вложенными списками
os.walk
и простыми суффиксами вместоglob
:Он может быть сжат до одной строки:
или обобщенный как функция:
Если вам нужны
glob
шаблоны полного стиля, вы можете последовать примеру Алекса и Бруно и использоватьfnmatch
:источник
Недавно мне пришлось восстанавливать свои фотографии с расширением .jpg. Я запустил PhotoRec и восстановил 4579 каталогов с 2,2 миллионами файлов, имеющих огромное количество расширений. С помощью приведенного ниже сценария я смог выбрать 50133 файлов с расширением havin .jpg за считанные минуты:
источник
Посмотрим
pathlib.rglob()
.Смотрите также связанный пост @ taleinat здесь и аналогичный пост в другом месте.
источник
Йохан и Бруно предлагают отличные решения по минимальным требованиям, как указано. Я только что выпустил муравьиный , который реализует Ant FileSet и комки , которые могут справиться с этим и более сложными сценариями. Реализация вашего требования:
источник
на основании других ответов это моя текущая рабочая реализация, которая извлекает вложенные файлы XML в корневой каталог:
Мне правда весело с питоном :)
источник
Еще один способ сделать это, используя только модуль glob. Просто замените метод rglob стартовым базовым каталогом и шаблоном, который будет соответствовать, и он вернет список совпадающих имен файлов.
источник
Для Python 3.5 и выше
дальше вам может понадобиться
источник
/**
этоfile_names_array = glob.glob('src/**/*.c', recursive=True)
Или с пониманием списка:
источник
Только что сделал это .. он будет печатать файлы и каталог в иерархическом порядке
Но я не использовал fnmatch или walk
источник
Тот использует fnmatch или регулярное выражение:
источник
В дополнение к предлагаемым ответам, вы можете сделать это с помощью некоторого ленивого поколения и магии понимания списка:
Помимо встраивания в одну строку и исключения ненужных списков в памяти, у этого также есть приятный побочный эффект, который вы можете использовать аналогично оператору **, например, вы можете использовать его
os.path.join(root, 'some/path/*.c')
для получения всех файлов .c во всех подкаталоги src, которые имеют эту структуру.источник
Это рабочий код на Python 2.7. Как часть моей работы с devops, я должен был написать скрипт, который бы перемещал файлы конфигурации, отмеченные live-appName.properties, в appName.properties. Могут быть и другие файлы расширения, например live-appName.xml.
Ниже приведен рабочий код для этого, который находит файлы в заданных каталогах (уровень вложенности), а затем переименовывает (перемещает) его в нужное имя файла
Эта функция вызывается из основного скрипта
Надеюсь, что это помогает кому-то бороться с подобными проблемами.
источник
Упрощенная версия ответа Йохана Далина, без fnmatch .
источник
Вот мое решение, использующее понимание списка для рекурсивного поиска нескольких расширений файлов в каталоге и во всех подкаталогах:
источник
источник
Я изменил верхний ответ в этой публикации ... и недавно создал этот скрипт, который будет перебирать все файлы в данном каталоге (searchdir) и подкаталогах в нем ... и печатать имя файла, rootdir, дату изменения / создания и размер.
Надеюсь, это кому-нибудь поможет ... и они могут пройтись по каталогу и получить fileinfo.
источник
Вот решение, которое сопоставит шаблон с полным путем, а не только с базовым именем файла.
Оно использует
fnmatch.translate
для преобразования шаблона в стиле glob в регулярное выражение, которое затем сопоставляется с полным путем каждого файла, найденного при обходе каталога.re.IGNORECASE
необязателен, но желателен в Windows, поскольку сама файловая система не чувствительна к регистру. (Я не стал компилировать регулярное выражение, потому что в документах указано, что его следует кэшировать внутри.)источник
Мне нужно решение для Python 2.x, которое работает быстро на больших каталогах.
Я согласен с этим:
Обратите внимание, что вам может потребоваться некоторая обработка исключений в случае, если
ls
не найден соответствующий файл.источник
ls src/**/*.c
работает , только если включена опция globstar (shopt -s globstar
) - подробности смотрите в этом ответе .