предложения, необходимые для подхода Python Scandir - PullRequest
0 голосов
/ 12 июня 2018

В папке 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 ]

0 голосов
/ 12 июня 2018

Давайте начнем с самого простого - почему вы строите datetime только для того, чтобы переформатировать его как строку, а затем выполнить сравнение строк?

Тогда естьВесь смысл использования os.scandir() сверх os.listdir() - os.scandir() возвращает os.DirEntry, который кэширует статистику файла черезos.DirEntry.stat() call.

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

0 голосов
/ 12 июня 2018

Вы можете попробовать использовать os.listdir(path), чтобы получить все файлы и каталоги по указанному пути.

Как только у вас есть все файлы и каталоги, вы можете использовать filter и лямбда-функцию для создания нового списка только файлов с нужной временной меткой.

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

...