Os.walk без скрытых папок
Мне нужно перечислить все файлы с содержащим путь к каталогу внутри папки. Я попытался использовать os.walk
, что, очевидно, было бы идеальным решением.
Однако он также отображает скрытые папки и файлы. Я хочу, чтобы мое приложение не отображало скрытые папки или файлы. Есть ли какой-либо флаг, который вы можете использовать, чтобы он не выдавал скрытых файлов?
Кросс-платформенная для меня не очень важна, это нормально, если она работает только для linux (. * pattern)
Ответы
Ответ 1
Нет, нет опции os.walk()
, которая пропустит их. Вам нужно будет сделать это самостоятельно (что достаточно просто):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
Обратите внимание на назначение фрагмента dirs[:] =
; мы заменяем элементы в dirs
(а не на список, обозначенный dirs
), так что os.walk()
не будет обрабатывать удаленные каталоги.
Это работает, только если аргумент ключевого слова topdown
находится в True
, из документации os.walk()
:
Когда topdown
есть True
, вызывающий может изменить список dirnames на месте (возможно, используя del
или назначение slice), а walk()
будет только возвращаться в подкаталоги, имена которых остаются в dirnames; это можно использовать для обрезки поиска, наложения определенного порядка посещения или даже информирования walk()
о каталогах, которые вызывающий создает или переименовывает, прежде чем он снова возобновит walk()
.
Ответ 2
Я понимаю, что этого вопроса не задавали, но у меня была аналогичная проблема, когда я хотел исключить как скрытые файлы, так и файлы, начинающиеся с __
, в частности __pycache__
. Я приземлился на этот вопрос, потому что я пытался понять, почему мое понимание списка не делает то, что я ожидал. Я не изменял список с помощью dirnames[:]
.
Я создал список префиксов, которые я хотел исключить и изменить имена dirnames:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]