Вопрос или проблема
Я пытаюсь перечислить старые файлы, дата которых старше сегодняшней (20241029):
Например, если сегодняшняя дата 20241029, я хотел бы перечислить первые два файла с датами 20241027 и 20241028.
WH_BEE_FULL_20241027_1.bak
WH_BEE_FULL_20241028_1.bak
WH_BEE_FULL_20241029_1.bak
Ниже приведен скрипт Python, который я пытался заставить работать:
import os
import datetime
from datetime import datetime
def filter_dates_older_than_today(date_list):
today = datetime.date.today()
todayStr = str(today)
nonhyphen_today = todayStr.replace('-','')
return [date for date in date_list if date <
datetime.datetime.strptime(nonhyphen_today,"%Y%m%d")]
folder = "C:\\MyDoc"
dates = os.listdir(folder)
older_dates = filter_dates_older_than_today(dates)
print(older_dates)
Я пытался сделать обе переменные ‘today’ и ‘datetime.datetime.strptime(nonhyphen_today,”%Y%m%d”)’ работающими, но не могу удовлетворить обе.
При ‘datetime.datetime.strptime(nonhyphen_today,”%Y%m%d”)’ я пытаюсь преобразовать строку в datetime, чтобы я мог использовать < .
Когда я запустил это, я получил ошибку:
'method_descriptor' object has no attribute 'today'
.
Ответ или решение
Ошибка 'method_descriptor' object has no attribute 'today'
в приведённом вами фрагменте кода возникает из-за неправильного импорта или обращения к функции today
, которая должна быть частью класса datetime.date
. Давайте подробно разберемся в вашем коде и исправим его.
Контекст ошибки
В вашем коде вы используете два раза datetime
: один раз вы импортируете всю библиотеку как import datetime
, а затем отдельно импортируете класс datetime
из модуля datetime
с помощью from datetime import datetime
. Это создает путаницу.
Когда вы пишете today = datetime.date.today()
, интерпретатор ищет метод today
у объекта datetime.date
. Ошибка 'method_descriptor' object has no attribute 'today'
указывает на то, что интерпретатор не может найти этот метод, потому что происходит путаница в импортах.
Исправленный код
Давайте исправим ваш код следующим образом:
import os
from datetime import date, datetime
def filter_dates_older_than_today(date_list):
# Получаем сегодняшнюю дату
today = date.today()
todayStr = str(today)
nonhyphen_today = todayStr.replace('-', '') # Убираем дефисы из даты
# Формируем список дат, старше сегодняшней
return [date for date in date_list if date < nonhyphen_today]
folder = "C:\\MyDoc"
dates = os.listdir(folder)
# Преобразуем имена файлов в список дат
dates = [file.split('_')[2] for file in dates if file.endswith('.bak')] # Извлекаем дату из названия файла
older_dates = filter_dates_older_than_today(dates)
print(older_dates)
Объяснение исправлений
-
Упрощение импорта: Вместо
import datetime
иfrom datetime import datetime
, мы используем толькоfrom datetime import date, datetime
. Это упрощает код и устраняет возможную путаницу. -
Форматирование дат: Теперь мы извлекаем дату непосредственно из названий файлов, используя метод
split
по символу_
. Обратите внимание, что мы предполагаем, что имя файла всегда будет в формате, в котором дата находится на третьем месте. -
Проверка типа файла: Мы добавили условие для проверки, что файл заканчивается на
.bak
, чтобы исключить из анализа все лишние файлы.
Примечания
-
Проверка ошибок: Убедитесь, что в папке
"C:\\MyDoc"
есть файлы в ожидаемом формате. Если нет, то ваш код может выдавать пустой результат. -
Тестирование: Рекомендуется тестировать код на реальных данных, чтобы убедиться в его правильной работе.
С помощью этих исправлений ваш код должен выполнять поставленную задачу без возникновения ошибки, и вы сможете успешно выводить файлы с датами, предшествующими сегодняшнему дню.