glob
возвращает соответствующие пути в произвольном порядке, и он не понимает %m-%d-%Y
(его не так умен).
Вам необходимо прочитать список путей, извлечь имя файла, а затем получить дату из имени файла. Это будет ключ, который вы будете использовать для сортировки списка файлов.
Вот один из способов сделать это:
import glob
import os
import datetime
def sorter(path):
filename = os.path.basename(path)
return datetime.datetime.strptime(filename[12:22], '%m-%d-%Y')
pattern = "test_report-*"
search_path = r'C:\temp\test\' # or 'c:/temp/test/'
file_list = glob.glob(pattern+search_path)
# Order by the date
ordered_list = sorted(file_list, key=sorter, reverse=True)
os.path.basename
является функцией, чтобы вернуть последний компонент пути; поскольку glob
вернет полный путь, последним компонентом будет имя файла.
Поскольку ваше имя файла имеет фиксированный формат - вместо того, чтобы сбрасывать регулярные выражения, я просто захватил часть даты, нарезая имя файла и преобразовывая его в объект datetime.
Наконец, sorted
возвращает результат сортировки (нормальный sort
метод является вместо рода). Ключевой функцией является то, что извлекает дату и возвращает ее, reverse=True
требуется для получения возвращенного списка в порядке последнего.
Вы можете сократить код немного, передавая результат glob.glob
непосредственно отсортирован:
ordered_list = sorted(glob.glob(pattern+search_path), key=sorter, reverse=True)
Чтобы объединить это с помощью функции вы написали:
import glob, os, datetime
def sorter(path):
filename = os.path.basename(path)
return datetime.datetime.strptime(filename[12:22], '%m-%d-%Y')
def getLatestFile(path="./", pattern="*"):
fformat = path + pattern
archives = glob.glob(fformat)
if len(archives):
return sorted(archives, key=sorter, reverse=True)[0]
У вас есть контроль над соглашением именования файлов? Ответы ниже будут работать, но лучшее именование может обеспечить лучшую читаемость как с python, так и при листинге файлов в другом месте. – mhlester
К сожалению, нет. Я застрял в формате. – Eric
Достаточно честный; всегда стоит того! Ниже приведены ответы, которые должны работать тогда – mhlester