Сравнение дат файлов в каталоге

Я пытаюсь написать скрипт на Python для загрузки серии фотографий в зависимости от даты их создания. У меня возникла проблема сравнения дат каждого из файлов с датой до и после даты, которую я хочу, чтобы я мог создать массив для цикла для моей загрузки. Вот что у меня есть:

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time, datetime

array = []

area = "/home/user/blah"
# Edit the path to match your desired folder between the ""
os.chdir(area)
retval = os.getcwd()
# Puts you in the desired directory

dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
entries = ((stat[ST_CTIME], path)
           for stat, path in entries if S_ISREG(stat[ST_MODE]))

for cdate, path in sorted(entries):
    filedate = time.ctime(cdate)
    if filedate < datetime.date(2015,03,13) and filedate > datetime.date(2015,02,17):
        print time.ctime(cdate)
        print os.path.basename(path)

Есть ли способ сделать это с помощью ctime или есть лучший способ?

2 ответа

Решение

ctime возвращает строковое представление, если вы хотите сравнить со временем, вы должны сравнить timestamp или datetime класс.

for cdate, path in sorted(entries):
    # compare by timestamp
    #if cdate < time.mktime(datetime.date(2015,03,13).timetuple()) and \
    #    cdate > time.mktime(datetime.date(2014,02,17).timetuple()):

    # compare by datetime
    filedate = datetime.datetime.fromtimestamp(cdate)
    if filedate < datetime.datetime(2015,03,13) and \
            filedate > datetime.datetime(2014,02,17):
        print time.ctime(cdate)
        print os.path.basename(path)

Там нет реальной необходимости os.chdir() Вот. Работа с абсолютными именами файлов - это хорошо. Вы можете упростить критерии выбора, используя список-комп, datetime, os.path.isfile а также os.path.getctimeНапример:

import os
from datetime import datetime

files = [
    fname
    for fname in sorted(os.listdir(dirpath))
    if os.path.isfile(fname) and
    datetime(2015, 2, 17) <= datetime.fromtimestamp(os.path.getctime(fname)) <= datetime(2015, 3, 13)
]

Это возвращает список всех файлов между двумя датами...

Я предполагаю, что вы используете Python 2.x, потому что в противном случае datetime.date(2015,03,13) будет давать вам SyntaxError в 3.х. Будьте осторожны с этим, как 03 является восьмеричным буквальным и просто работает в вашем случае - но 08/09 сломается, поскольку они недействительны для восьмеричного.

Другие вопросы по тегам