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



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



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



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



спасибо.

455   7  

7 ответов:

вы можете написать свое:

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

или вы можете использовать Глоб:

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

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

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

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

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

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

на 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
filter( lambda f: not f.startswith('.'), os.listdir('.'))

Глоб:

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

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

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

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))

Comments

    Ничего не найдено.