Я хочу открыть несколько подпапок в папке, найти несколько текстовых файлов и распечатать несколько строк текстовых файлов. Я использую это:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Но это также не может получить доступ к подпапкам. Кто-нибудь знает, как я могу использовать ту же команду для доступа к подпапкам?
python
filesystems
glob
fnmatch
UserYmY
источник
источник
Ответы:
В Python 3.5 и новее используйте новую рекурсивную
**/
функциональность:Если
recursive
установлен,**
то разделитель путей соответствует 0 или более подкаталогам.В более ранних версиях Python
glob.glob()
не может рекурсивно перечислять файлы в подкаталогах.В этом случае я бы использовать в
os.walk()
сочетании сfnmatch.filter()
вместо этого:Это будет рекурсивно просматривать ваши каталоги и возвращать все абсолютные пути к соответствующим
.txt
файлам. В этом конкретном случаеfnmatch.filter()
может быть излишним, вы также можете использовать.endswith()
тест:источник
path to directory
.recursive=False
вместе с**/
функциональностью не предоставляет список файлов только в данной папке, а скорее в ее дочерних?**/
выдает список имен каталогов в текущем рабочем каталоге, так тчо в/
, и сrecursive=False
вами в основном имеют двойное*
, соответствие так же , как*/
, просто менее эффективно.*/*
если вам нужны все файлы во всех подкаталогах.Чтобы найти файлы в непосредственных подкаталогах:
Для рекурсивной версии, которая просматривает все подкаталоги, вы можете использовать
**
и передавать,recursive=True
начиная с Python 3.5 :Оба вызова функций возвращают списки. Вы можете использовать
glob.iglob()
для возврата путей один за другим. Или используйтеpathlib
:Оба метода возвращают итераторы (вы можете получать пути один за другим).
источник
glob()
поддержки шаблонов в каталогах.**
случая рекурсии. Но для того,**
чтобы работать, вы должны установитьrecursion=True
переключатель, кстати.По этой теме много путаницы. Дайте мне посмотреть, смогу ли я это прояснить (Python 3.7):
glob.glob('*.txt') :
соответствует всем файлам, заканчивающимся на '.txt' в текущем каталогеglob.glob('*/*.txt') :
как 1glob.glob('**/*.txt') :
соответствует всем файлам, оканчивающимся на '.txt', только в непосредственных подкаталогах , но не в текущем каталогеglob.glob('*.txt',recursive=True) :
как 1glob.glob('*/*.txt',recursive=True) :
как 3glob.glob('**/*.txt',recursive=True):
соответствует всем файлам, заканчивающимся на '.txt', в текущем каталоге и во всех подкаталогахТак что лучше всегда указывать
recursive=True.
источник
Пакет glob2 поддерживает подстановочные знаки и работает достаточно быстро.
На моем ноутбуке сопоставление > 60 000 путей к файлам занимает примерно 2 секунды .
источник
Вы можете использовать Formic с Python 2.6
Раскрытие информации - я являюсь автором этого пакета.
источник
Вот адаптированная версия, которая включает
glob.glob
аналогичные функции без использованияglob2
.Итак, если у вас есть следующая структура каталога
Вы можете сделать что-то вроде этого
В значительной степени соответствие
fnmatch
шаблону всему самому файлу, а не только имени файла.источник
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Не работает во всех случаях, вместо этого используйте glob2
источник
Если вы можете установить пакет glob2 ...
Все имена файлов и папки:
источник
Если вы используете Python 3.4+, вы можете использовать
pathlib
модуль.Path.glob()
Метод поддерживает**
шаблон, что означает «этот каталог и все подкаталоги, рекурсивно». Он возвращает генератор, дающийPath
объекты для всех совпадающих файлов.источник
Как указал Мартин, glob может сделать это только с помощью
**
оператора, представленного в Python 3.5. Поскольку OP явно запросил модуль glob, следующее вернет итератор ленивой оценки, который ведет себя аналогичноОбратите внимание, что
configfiles
в этом подходе вы можете повторять только один раз . Если вам нужен реальный список файлов конфигурации, которые можно использовать в нескольких операциях, вам придется создать его явно, используяlist(configfiles)
.источник
Команда
rglob
выполнит бесконечную рекурсию на самом глубоком подуровне вашей структуры каталогов. Однако, если вам нужен только один уровень, не используйте его.Я понимаю, что OP говорил об использовании glob.glob. Однако я считаю, что это отвечает намерению, которое заключается в рекурсивном поиске всех подпапок.
Эта
rglob
функция недавно увеличила скорость в 100 раз для алгоритма обработки данных, который использовал структуру папок в качестве фиксированного допущения для порядка чтения данных. Однакоrglob
мы смогли выполнить одно сканирование всех файлов в указанном родительском каталоге или ниже, сохранить их имена в списке (более миллиона файлов), а затем использовать этот список, чтобы определить, какие файлы нам нужно открыть в любой момент. точки в будущем, основываясь только на соглашениях об именах файлов в зависимости от того, в какой папке они были.источник