Подтвердить что ты не робот

Os.walk без скрытых папок

Мне нужно перечислить все файлы с содержащим путь к каталогу внутри папки. Я попытался использовать os.walk, что, очевидно, было бы идеальным решением.

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

Кросс-платформенная для меня не очень важна, это нормально, если она работает только для linux (. * pattern)

4b9b3361

Ответ 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)]