Мой скрипт python выполняет, os.listdir(path)
где путь - это очередь, содержащая архивы, которые мне нужно обрабатывать один за другим.
Проблема в том, что я получаю список в виде массива, а затем просто выполняю простой array.pop(0)
. Он работал нормально, пока я не поставил проект на подрывную работу. Теперь я получаю .svn
папку в своем массиве, и, конечно же, это вызывает сбой моего приложения.
Итак, вот мой вопрос: есть ли функция, которая игнорирует скрытые файлы при выполнении, os.listdir()
и если нет, что было бы лучшим способом?
python
hidden-files
талниколас
источник
источник
listdir_nohidden
не совсем совместима сos.listdir
, так как использованиеyield
делает ее генератором. Вместо этого он должен просмотреть список выводаos.listdir
и удалить записи, начинающиеся с '.'list(listdir_nohidden(path))
и с которой она точно совместимаos.listdir
.Это старый вопрос, но похоже, что ему не хватает очевидного ответа об использовании понимания списка, поэтому я добавляю его здесь для полноты:
[f for f in os.listdir(path) if not f.startswith('.')]
В качестве побочного примечания, состояние документов
listdir
будет возвращать результаты в «произвольном порядке», но общий вариант использования - их сортировка в алфавитном порядке. Если вы хотите, чтобы содержимое каталога было отсортировано по алфавиту без использования заглавных букв, вы можете использовать:sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
источник
key=lambda f: f.lower()
можно написать без лямбды:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.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
источник
[f for f in os.listdir(path) if not folder_is_hidden(f)]
У Джошмейкера есть правильное решение вашего вопроса.
Как игнорировать скрытые файлы с помощью os.listdir ()?
Однако в Python 3 рекомендуется использовать pathlib вместо os.
from pathlib import Path visible_files = [ file for file in Path(".").iterdir() if not file.name.startswith(".") ]
источник
glob :
>>> import glob >>> glob.glob('*')
(
glob
утверждает, что используетlistdir
иfnmatch
под капотом, но также проверяет наличие интерлиньяжа'.'
, а не с помощьюfnmatch
.)источник
Я думаю, что перебирать все элементы в цикле - это слишком большая работа. Я бы предпочел что-нибудь попроще:
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 упомянул, что glob работает хорошо:
import glob glob.glob('*')
источник
.DS_Store
автоматически создается. Когда я заархивирую все файлы и отправляю их на сервер,.DS_Store
тоже добавляется. Если есть различные скрытые файлы, возможно, вы можете попробоватьos.system('ls -1')
os.popen('ls -1').read()
не будет работать в Windows. В этом весь смыслos.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
источник