Сравнение дат файлов в каталоге
Я пытаюсь написать скрипт на 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
сломается, поскольку они недействительны для восьмеричного.