Почему я получаю TypeError при сравнении двух datetime в python? - PullRequest
2 голосов
/ 16 октября 2019

Я пытаюсь написать какой-то код, который удаляет все текстовые файлы из папки старше 30 дней.

Я новичок в python и знаю, что приведенный ниже код не самый чистый,Мой исходный код был более аккуратным, например, поместив в переменные datetime.datetime.now () и time.ctime (os.path.getctime (foundfile)), но я подумал, что это вызвало ошибку: TypeError: can't compare datetime.datetime to str. Но похоже, чтодаже с прямым методом ниже я все еще получаю эту ошибку.

import os
import time
import datetime

for file in os.listdir('/MyDir/'):
    foundfile = os.path.join('/MyDir/', file)
    if file.endswith('txt') and time.ctime(os.path.getctime(found 
 file)) < datetime.datetime.now() - datetime.timedelta(days=30):
        os.remove(os.path.join('/MyDir/', file))

Я ожидал бы, что код вычтет 30 дней от текущей даты, а затем удалит все текстовые файлы, которые старше, но я получаю ошибку:TypeError: can't compare datetime.datetime to str. Я не могу понять, почему.

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

time.ctime() возвращает строку, а не объект datetime. См. документацию .

Но почему вы все равно используете time.ctime()?

os.path.getctime() возвращает время как метку времени Unix. Вы можете преобразовать это в дату и время, используя datetime.datetime.utcfromtimestamp(), т.е.

datetime.datetime.utcfromtimestamp(os.path.getctime(foundfile)))

. Это можно использовать напрямую по сравнению с другими объектами даты и времени. Другие ответы работают, но они конвертируют метку времени (с плавающей точкой) в строку в дату и время, тогда как мы пропускаем шаг и конвертируем непосредственно из метки времени в дату и время.

Тогда ваш код станет:

import os
import time
import datetime

for file in os.listdir('/MyDir/'):
    foundfile = os.path.join('/MyDir/', file)
    if file.endswith('txt') and (datetime.datetime.utcfromtimestamp(os.path.getctime(foundfile)) < (datetime.datetime.now() - datetime.timedelta(days=30))):
        os.remove(os.path.join('/MyDir/', file))

Или, чтобы сделать его немного более читабельным:

import os
import datetime as dt

for file in os.listdir('/MyDir/'):
    foundfile = os.path.join('/MyDir/', file)
    filecreation = dt.datetime.utcfromtimestamp(os.path.getctime(foundfile))
    cutofftime = dt.datetime.now() - dt.timedelta(days=30)
    if (file.endswith('txt') and (filecreation < cutofftime)):
        os.remove(os.path.join('/MyDir/', file))
1 голос
/ 16 октября 2019

Значение, которое вы получаете от time.ctime(os.path.getctime(found file)), является строкой. Вам нужно преобразовать этот объект в объект datetime для python, чтобы сравнить оба объекта. Вы можете сделать это, используя метод datetime.dateime.strptime().

import datetime
x = time.ctime(os.path.getctime(found file))
x = x.strftime('%Y-%m-%d %H:%M:%S')
x = datetime.datetime.strptime(x,'%Y-%m-%d %H:%M:%S')

Затем сравните этот объект даты и времени 'x' в операторе if

0 голосов
/ 16 октября 2019

Функция time.ctime возвращает строку, тогда как вы пытаетесь сравнить ее с экземпляром datetime.datetime

Если вы хотите сравнить, я предлагаю вам преобразовать ctime во время. Вы можете использовать следующую функцию из этого ответа:

datetime_from_ctime = datetime.datetime.strptime(ctime_str, "%a %b %d %H:%M:%S %Y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...