Как игнорировать скрытые файлы, используя os.listdir ()? - PullRequest
66 голосов
/ 18 августа 2011

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

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

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

Спасибо.

Ответы [ 7 ]

77 голосов
/ 18 августа 2011

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

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, '*'))

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

27 голосов
/ 24 октября 2014

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

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

В качестве примечания, состояние документовlistdir будет возвращать результаты в «произвольном порядке», но в общем случае они сортируются в алфавитном порядке.Если вы хотите, чтобы содержимое каталога сортировалось в алфавитном порядке без учета заглавных букв, вы можете использовать:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
16 голосов
/ 28 декабря 2012

В 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
12 голосов
/ 30 апреля 2013
filter( lambda f: not f.startswith('.'), os.listdir('.'))
11 голосов
/ 18 августа 2011

Glob

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

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

7 голосов
/ 18 мая 2018

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

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')
1 голос
/ 09 декабря 2017
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
...