Как игнорировать скрытые файлы с помощью os.listdir()?
Мой python script выполняет os.listdir(path)
, где путь представляет собой очередь, содержащую архивы, которые мне нужно обрабатывать один за другим.
Проблема в том, что я получаю список в массиве, а затем просто делаю простой array.pop(0)
. Он работал нормально, пока я не включил проект в подрывную деятельность. Теперь я получаю папку .svn
в моем массиве и, конечно, это приводит к сбою приложения.
Итак, вот мой вопрос: существует ли существующая функция, которая игнорирует скрытые файлы при выполнении os.listdir()
, а если не то, что было бы лучшим способом?
Спасибо.
Ответы
Ответ 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('.'))