繁体   English   中英

Python处理日期和时间

[英]Python dealing with dates and times

我正在寻找以下解决方案:

鉴于今天的日期,弄清楚之前的几个月。 所以2应该今天回归,因为它目前是3月,也就是今年的第3个月。 12月应该返回1月份。

然后基于此,我需要能够遍历目录并查找当月创建的所有文件。

奖励积分包括查找上个月创建的最新文件。

最简单, adatedatetime.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的目录中的树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

现在,给出文件全名(即inc。路径)列表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

上个月相当容易找到 - 例如,参见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上不起作用 - 在这种情况下不会存储创建时间(您只需获取上次更改的时间) 。

这里有几个部分被问到......

  • 您可以使用datetime获取当前月份: datetime.datetime.now().month 从那里你可以减去一个并将0转为12. Python datetime doc: http//docs.python.org/library/datetime.html

  • 接下来,您可以使用os.walk Python os.walk doc迭代磁盘文件夹: http//docs.python.org/library/os.html#os.walk

  • 最后,您可以使用os.stat Python os.stat doc检查文件的创建/修改时间: http ://docs.python.org/library/os.html#os.stat

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来查找有问题的文件。

使用像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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM