Как игнорировать скрытые файлы с помощью ОС.listdir()?
мой скрипт python выполняет os.listdir(path) где путь-это очередь, содержащая архивы, которые мне нужно обработать один за другим.
проблема в том, что я получаю список в массиве, а затем я просто делаю простой array.pop(0). Он работал нормально, пока я не поставил проект в subversion. Теперь я получаю .svn папка в моем массиве и, конечно, это делает мое приложение аварии.
так вот мой вопрос: существует ли функция, которая игнорирует скрытые файлы при выполнении os.listdir() а если бы не то, что было бы лучшим способом?
спасибо.
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
Глоб:
>>> import glob >>> glob.glob('*')(
globутверждает, что используетlistdirиfnmatchпод капотом, но он также проверяет ведущий'.', а не с помощьюfnmatch.)
Я думаю, что это слишком много работы, чтобы пройти через все элементы в цикле. Я бы предпочел что-то более простое, как это:
lst = os.listdir(path) if '.DS_Store' in lst: lst.remove('.DS_Store')
Comments