Глоб для файлов в каталоге и ниже - PullRequest
1 голос
/ 31 октября 2019

Я знаю, что могу получить непосредственное содержимое каталога с помощью glob.glob("dir/*"). Я также могу получить все содержимое подкаталогов рекурсивно с чем-то вроде glob.glob("dir/**/*"), но это не будет содержать прямого содержимого dir/. Есть ли какой-нибудь шарообразный паттерн, который даст мне союз двух;все внутри dir/, рекурсивно?

Редактировать: Если у меня XY проблемы с , то я работаю над сценарием setup.py и хочу включить весь каталог какpackage_data. Я сейчас делаю package_data=["resources/*", "resources/**/*"], но мне это кажется немного странным ...

1 Ответ

2 голосов
/ 31 октября 2019

You glob pattern dir/**/* подходит для рекурсивного сопоставления файлов в каталоге dir и подкаталогах;вам нужно передать именованный аргумент recursive=True:

glob.glob('dir/**/*', recursive=True)

Проблема в том, что без recursive=True, glob будет трактовать шаблон ** (рекурсивный глобус) как обычный * (ноль или более символов) и будет соответствовать любым файлам в dir/<subdir>/. Когда вы передаете параметр, ** обрабатывается специально, то есть как рекурсивный шаблон глобуса.


Кроме того, если ваша цель состоит в том, чтобы просто перебирать файлы, лучше использовать iglob, чтобы получитьитератор вместо списка:

glob.iglob('dir/**/*', recursive=True)
...