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

Как игнорировать скрытые файлы с помощью os.listdir()?

Мой python script выполняет os.listdir(path), где путь представляет собой очередь, содержащую архивы, которые мне нужно обрабатывать один за другим.

Проблема в том, что я получаю список в массиве, а затем просто делаю простой array.pop(0). Он работал нормально, пока я не включил проект в подрывную деятельность. Теперь я получаю папку .svn в моем массиве и, конечно, это приводит к сбою приложения.

Итак, вот мой вопрос: существует ли существующая функция, которая игнорирует скрытые файлы при выполнении os.listdir(), а если не то, что было бы лучшим способом?

Спасибо.

4b9b3361

Ответ 1

Вы можете написать его самостоятельно:

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

Или вы можете использовать glob:

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

Любой из них будет игнорировать все имена файлов, начинающиеся с '.'.

Ответ 2

Это старый вопрос, но похоже, что отсутствует очевидный ответ на использование понимания списка, поэтому я добавляю его здесь для полноты:

[f for f in os.listdir(path) if not f.startswith('.')]

В качестве примечания стороны docs state listdir вернут результаты в "произвольный порядок", но обычный пример использования - упорядочить их по алфавиту. Если вы хотите, чтобы содержимое каталога в алфавитном порядке сортировалось без учета капитализации, вы можете использовать:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

Ответ 3

В Windows, Linux и OS X:

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx

Ответ 4

glob:

>>> import glob
>>> glob.glob('*')

(glob утверждает, что использует listdir и fnmatch под капотом, но также проверяет ведущий '.', а не используя fnmatch.)

Ответ 5

filter( lambda f: not f.startswith('.'), os.listdir('.'))

Ответ 6

Я думаю, что это слишком много работы, чтобы пройти все пункты в цикле. Я бы предпочел что-то более простое, как это:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

Если каталог содержит более одного скрытого файла, это может помочь:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

для независимости от платформы, как упомянул @Josh, глоб работает хорошо:

import glob
glob.glob('*')

Ответ 7

filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))