我正在寻找以下解决方案:
鉴于今天的日期,弄清楚之前的几个月。所以2应该今天回归,因为它目前是3月,也就是今年的第3个月。 12月应该返回。
然后基于此,我需要能够遍历目录并查找当月创建的所有文件。
奖励积分包括查找上个月创建的最新文件。
答案 0 :(得分:3)
最简单,其中adate
是datetime.date
的实例:
def previousmonth(adate):
m = adate.month - 1
return m if m else 12
在大多数Unix文件系统中没有真正的方法来确定何时创建文件,因为他们只是不保留这些信息。也许你想要“最新的inode更改时间”(可能是创建,也可能是其他一些inode更改):
import os, datetime
def cmonth(filename):
ts = os.stat(filename).st_ctime
return datetime.date.fromtimestamp(ts).month
当然,这可能意味着任何年的那个月 - 你确定,在这两个问题中,你不想要年以及月份?那将是.year
属性。
无论如何,根据你的问题,仅针对单个目录(这是你的问题的字母)坚持使用月份来获取你可以使用的所有文件os.listdir
(对于一个植根于你的目录中的树)请改用os.walk
。然后只保留在给定月份内具有最新inode-change的那些:
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)
当然,根据您的具体规格,您可以将这些全部放在一起有很多自由度 - 假设规格看起来不一定精确或完整我已选择显示构建块你可以很容易地调整和整合你的确切需求,而不是一个完整的解决方案,可能会解决与你的实际问题有些不同的问题; - )。
修改:由于OP澄清了他们需要年份和月份,让我们看看需要进行哪些更改,使用元组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
答案 1 :(得分:2)
上个月相当容易找到 - 例如,参见Alex Martelli的回答 - 但是找到当月最近创建的文件有点困难:
from datetime import date
import os
def filesLastMonth(directory):
"""
Given a directory, returns a tuple containing
1. A list with all files made in the previous month (disregards year...)
2. The file most recently created in the previous month
"""
def fileCreationTime(filePath):
return os.path.getctime(filePath)
today = date.today()
lastMonth = today.month-1 if today.month != 1 else 12
# gets each item in the directory that was created last month
createdLastMonth = [item for item in os.listdir(directory) if
date.fromtimestamp(os.path.getctime(item)).month == lastMonth]
# and this is the most recent of the above
mostRecentlyLastMonth = max(createdLastMonth, key=fileCreationTime)
return (createdLastMonth, mostRecentlyLastMonth)
您可以在Windows 上使用os.path.getctime
来获取路径的创建时间,但这在Unix上不起作用 - 在这种情况下不会存储创建时间(你'我只是得到最后一次改变的时间。)
答案 2 :(得分:1)
这里有几个部分被问到......
您可以datetime
使用datetime.datetime.now().month
来获取当前月份:os.walk
。从那里你可以减去一个并将0变为12. Python datetime doc:http://docs.python.org/library/datetime.html
接下来,您可以使用os.stat
Python os.walk doc迭代磁盘文件夹:http://docs.python.org/library/os.html#os.walk
最后,您可以使用{{1}} Python os.stat doc检查文件的创建/修改时间:http://docs.python.org/library/os.html#os.stat
答案 3 :(得分:0)
http://docs.python.org/library/datetime.html
从上个月的第一个月开始
def first_of( today )
yr_mn = today.year*12 + (today.month-1) - 1
return datetime.date( year= yr_mn//12, month= yr_mn%12+1, day=1 )
然后,您可以使用此os.walk
来查找相关文件。
答案 4 :(得分:0)
日期操作对于像Labix的python-dateutil这样的库来说是微不足道的。
你想做这样的事情:
In [8]: from dateutil.relativedelta import relativedelta
In [9]: from datetime import date
In [10]: d = date(2010,2,12)
In [11]: print (d-relativedelta(months=1)).month
1
In [12]: print (date(2010,1,4)-relativedelta(months=1)).month
12