Предложения, необходимые для подхода Python Scandir
В папке 10 000 файлов. несколько файлов, созданных в 2018-06-01, немногие в 2018-06-09, как это. Мне нужно найти все файлы, которые созданы на 2018-06-09. Но это занимает много времени (почти 2 часа), чтобы прочитать каждый файл и получить дату создания файла, а затем получить файлы, созданные в 2018-06-09.
for file in os.scandir(Path):
if file.is_file():
file_ctime =datetime.fromtimestamp(os.path.getctime(file)).strftime('%Y- %m- %d %H:%M:%S')
if file_ctime[0:4] == '2018-06-09'
.....
2 ответа
Давайте начнем с самой основной вещи - почему вы строите datetime
только переформатировать его как строку, а затем сделать сравнение строк?
Тогда есть весь смысл использования os.scandir()
над os.listdir()
- os.scandir()
возвращает os.DirEntry
который кэширует статистику файла через os.DirEntry.stat()
вызов.
В зависимости от проверок вам нужно выполнить, os.listdir()
может даже работать лучше, если вы ожидаете много фильтрации по имени файла, так как тогда вам не нужно будет создавать целое os.DirEntry
просто отказаться от него.
Итак, чтобы оптимизировать ваш цикл, если вы не ожидаете много фильтрации по имени:
for entry in os.scandir(Path):
if entry.is_file() and 1528495200 <= entry.stat().st_ctime < 1528581600:
pass # do whatever you need with it
Если вы делаете, то лучше придерживаться os.listdir()
как:
import stat
for entry in os.listdir(Path):
# do your filtering on the entry name first...
path = os.path.join(Path, entry) # build path to the listed entry...
stats = os.stat(path) # cache the file entry statistics
if stat.S_ISREG(stats.st_mode) and 1528495200 <= stats.st_ctime < 1528581600:
pass # do whatever you need with it
Если вы хотите быть гибкими с отметками времени, используйте datetime.datetime.timestamp()
заранее, чтобы получить временные метки POSIX, а затем вы можете сравнить их с тем, что stat_result.st_ctime
возвращается напрямую без конвертации.
Тем не менее, даже ваш оригинальный, неоптимизированный подход должен быть значительно быстрее, чем 2 часа всего за 10 000 записей. Я бы тоже проверил базовую файловую систему, там что-то не так.
Вы можете попробовать использовать os.listdir(path)
получить все файлы и директории по указанному пути.
Как только у вас есть все файлы и каталоги, вы можете использовать filter
и лямбда-функция для создания нового списка только файлов с желаемой отметкой времени.
Затем вы можете выполнить итерацию по этому списку, чтобы выполнить необходимую работу с правильными файлами.