Предложения, необходимые для подхода 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 и лямбда-функция для создания нового списка только файлов с желаемой отметкой времени.

Затем вы можете выполнить итерацию по этому списку, чтобы выполнить необходимую работу с правильными файлами.

Другие вопросы по тегам