Как составить хронологический список файлов с указанием даты изменения файла - PullRequest
5 голосов
/ 04 июня 2011

Я хочу создать список тех файлов в каталоге, которые имеют расширение .bas, и которые были изменены после 1 июня 2011 года. Также я хотел бы знать, как при желании отображать файлы в списке с датой и временем последнего изменения файла, например, «filename.bas 2011-06-04_AM.00.30»

Я новичок в питоне. Мне удалось перечислить файлы с расширением .bas, отсортированные по дате, используя следующий код:

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time, glob
search_dir = r"e:\test"
files = filter(os.path.isfile, glob.glob(search_dir + "\\*.bas"))
files.sort(key=lambda x: os.path.getmtime(x))

Но я не могу понять, как добавить «дату» к имени файла в списке.

Буду очень признателен за любые предложения.

1 Ответ

4 голосов
/ 04 июня 2011

Соберите файлы и даты в список кортежей и отсортируйте их по элементу даты. Вот пример кода, комментариев в нем должно быть достаточно, чтобы его понять:

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time, glob
search_dir = r"e:\test"
files = filter(os.path.isfile, glob.glob(search_dir + "\\*.bas"))
file_date_tuple_list = []
for x in files:
    d = os.path.getmtime(x)
    #tuple with file and date, add it in a list
    file_date_tuple = (x,d)
    file_date_tuple_list.append(file_date_tuple)
#sort the tuple list by the second element which is the date
file_date_tuple_list.sort(key=lambda x: x[1])

При желании вы можете использовать понимание списка, чтобы сделать код более компактным и чистым ...

file_date_tuple_list = [(x,os.path.getmtime(x)) for x in files]
file_date_tuple_list.sort(key=lambda x: x[1])

Эти две строки заменят весь цикл for из первого примера.

Теперь, если в списке есть строка с форматированным именем и датой, тогда ... добавьте этот импорт ...

from datetime import date

и еще одна строка с этим пониманием списка, которая принимает метку времени изменения и форматирует ее в строку.

file_date_string_list = ["%s %s"%(x[0],date.fromtimestamp(x[1])) \
                                             for x in file_date_tuple_list]

Для изменения порядка сортировки используйте необязательный параметр reverse в исполнении sort:

file_date_tuple_list.sort(key=lambda x: x[1],reverse=True)

Для ограничения даты определенным datetime

from datetime import datetime
limit = datetime(2011,01,05,17,0,0) #5pm , Jun 5 2011 
file_date_string_list = ["%s %s"%(x[0],date.fromtimestamp(x[1])) \
                                       for x in file_date_tuple_list \
                                       if datetime.fromtimestamp(x[1]) > limit ]

Как видите, вы можете добавить условие if в понимание списка, что действительно здорово.

...