Содржина на објавата
Как проверить является ли директория пустой? Самый простой способ: if os.listdir(path): ... Тоже самое с pathlib p = Path(path) if list(p.iterdir()): ... В первом случае функция os.listdir возвращает полный список файлов. Нам остаётся проверить есть ли там что-либо. Во втором случае мы получаем генератор, который под капотом использует тот же listdir. Теперь представим что в директории 10к файлов for i in range(10000): Path(f'/tmp/test/test{i}.txt').touch() Не сказать, что при наличии SSD это проблема, но когда таких операций много, мы начинаем терять время, особенно с pathlib. import timeit test_path = '/tmp/test' count = 1000 >>> timeit.timeit('list(os.listdir(p))', setup=f'import os;p="{test_path}"', number=count) 2.281363710993901 >>> timeit.timeit('list(p.iterdir())', setup=f'from pathlib import Path;p=Path("{test_path}")', number=count) 5.6957218300012755 То есть мы получаем список всех 10к файлов просто чтобы узнать что там есть файлы. Хотя нам надо узнать есть ли по указанному пути хотя бы один файл. Для того чтобы ускорить проверку лучше воспользоваться функцией os.scandir(). Она работает на много быстрей и возвращает итератор с объектами os.DirEntry. Чтобы узнать есть ли в директории хоть один файл достаточно использовать функцию next() next(os.scandir(path)) Но если директория пустая, то мы получим ошибку. Поэтому добавляем значение по умолчанию и можно использовать конструкцию в условном операторе if next(os.scandir(path), None): ... Либо используем функцию any(), так как она завершится сразу после нахождения первого файла или если итератор пуст. if any(os.scandir(path)): ... Сравним скорость >>> timeit.timeit('next(os.scandir(p), None)', setup=f'import os;p="{test_path}"', number=count) 0.2183076049986994 >>> timeit.timeit('any(os.scandir(p))', setup=f'import os;p="{test_path}"', number=count) 0.21016486900043674 #tricks