Простейший, где adate
- это экземпляр datetime.date
:
def previousmonth(adate):
m = adate.month - 1
return m if m else 12
В большинстве файловых систем Unix нет реального способа определить, когда был создан файл, поскольку они просто не хранят эту информацию. Может быть, вы хотите «последнее время изменения инода» (может быть создание, может быть другое изменение инода):
import os, datetime
def cmonth(filename):
ts = os.stat(filename).st_ctime
return datetime.date.fromtimestamp(ts).month
Конечно, это может означать, что месяц в любом году - вы уверены, что в обоих вопросах вам не нужен год , а также месяц? Это будет атрибут .year
.
В любом случае, придерживаясь только месяца, согласно вашему вопросу, для одного каталога (который является буквой вашего вопроса), чтобы получить все файлы, которые вы можете использовать os.listdir
(для дерева, корни которого в каталоге, который вы используйте os.walk
вместо). Затем сохранить только те из них, для которых в последнем месяце произошли последние изменения inode:
def fileswithcmonth(dirname, whatmonth):
results = []
for f in os.listdir(dirname):
fullname = os.path.join(dirname, f)
if whatmonth == cmonth(fullname):
results.append(fullname)
return results
Вы можете кодировать это как понимание списка, но там слишком много кода, чтобы listcomp был элегантным и лаконичным.
Чтобы получить «самое последнее» время, вы можете либо повторить вызов os.stat (медленнее, но, вероятно, проще), либо изменить cmonth, чтобы также вернуть отметку времени. По простому маршруту:
def filetimestamp(fullname):
return os.stat(fullname).st_ctime
Теперь «самый последний файл», содержащий список files
полных имен файлов (то есть, включая путь), равен
max(files, key=filetimestamp)
Конечно, есть много степеней свободы в том, как вы сложите все это вместе, в зависимости от ваших точных спецификаций - учитывая, что спецификации не кажутся обязательно точными или полными, я решил показать строительные блоки вы можете легко настроить и собрать все под свои нужды, а не полноценное решение, которое, скорее всего, решит проблему, несколько отличную от вашей реальной; -).
Редактировать : поскольку ОП пояснил, что им нужны и год, и месяц, давайте посмотрим, какие изменения потребуются, используя кортежи ym
для (year, month)
вместо чистого месяца:
def previousym(adate):
y = adate.year
m = adate.month - 1
return (y, m) if m else (y - 1, 12)
import os, datetime
def cym(filename):
ts = os.stat(filename).st_ctime
dt datetime.date.fromtimestamp(ts)
return cym.year, cym.month
def fileswithcym(dirname, whatym):
results = []
for f in os.listdir(dirname):
fullname = os.path.join(dirname, f)
# if you need to avoid subdirs, uncomment the following line
# if not os.path.isfile(fullname): continue
if whatym == cym(fullname):
results.append(fullname)
return results
Ничего глубокого или сложного, как вы можете видеть (я также добавил комментарии, чтобы показать, как пропускать подкаталоги, если вас это беспокоит). И, между прочим, если вам на самом деле нужно пройтись по поддереву, а не просто по каталогу, это изменение тоже довольно локализовано:
def fileswithcymintree(treeroot_dirname, whatym):
results = []
for dp, dirs, files in os.walk(treeroot_dirname):
for f in files:
fullname = os.path.join(dp, f)
if whatym == cym(fullname):
results.append(fullname)
return results