如何在Python中获取创建时间在x天、y小时和z分钟之前的文件?

0 投票
2 回答
643 浏览
提问于 2025-04-18 12:28

你好,我有一个程序,它应该能给我列出在当前时间之前创建的文件列表。

def filesOlderThan(path,day,hour,mins):
    file_list = []
    for root, dirs, files in os.walk(path):
        for a in files:
            path1 = root + "\\"+ a
            sub_time = datetime.datetime.today() - datetime.timedelta(days=day,hours=hour,minutes=mins)
            r_time = time.mktime(sub_time.utctimetuple())
            c_time = os.path.getctime(path1)
            if(r_time < c_time):
                file_list.append(path1)
    count = len(file_list)
    return file_list,count

files,count = filesOlderThan("C:\\Arena\\sample",0,0,10)

print count
for a in files:
    print a

当我运行这个程序时,

C:\Arena>python getFilesOlderThan.py  
0

这个程序在小时的情况下能正常工作,但在以下情况下就不行了:

  1. 我把分钟设置为10。
  2. 在C:\Arena\Sample目录下创建了一个文件。
  3. 运行程序后,程序没有给我这个文件。

2 个回答

0

我创建了这个函数,不过你可以对它进行修改。

import datetime
import time 

def diff(file):
    today = datetime.datetime.today()

    file_mtime = time.ctime(os.path.getmtime(file))
    t_ob = time.strptime(file_mtime)
    t = time.strftime("%Y-%m-%d %H-%M-%S", t_ob)
    file_d = datetime.datetime.strptime(t, "%Y-%m-%d %H-%M-%S")

    minutes = divmod((today-file_d).total_seconds(), 60)

    if (today - file_d).days > 30:
        return f"{round(((today - file_d).days)/30)} months"
    elif (today - file_d).days != 0:
        return f"{(today - file_d).days} days"
    elif minutes[0] > 59:
        return f"{round(minutes[0]/60)} huors"
    elif minutes[0] != 0:
        return f"{round(minutes[0])} minutes"
    else:
        return f"{round(minutes[1])} seconds"

>>>diff("file.txt")
1
r_time = time.mktime(sub_time.utctimetuple())

你现在是在把文件的时间戳(本地时间)和当前的UTC时间进行比较。

你应该用 timetuple(),而不是 utctimetuple

你可以对你的函数做一些小改进,比如用 datetime 来做计算,而不是用时间戳;用 datetime.now 替代 today;还有,使用跨平台的 os.join,而不是硬编码的Windows分隔符。此外,在函数内部计算列表的 len 似乎也没必要,如果需要的话可以在外面计算。

def filesOlderThan(path,day,hour,mins):
    delta= datetime.timedelta(days=day,hours=hour,minutes=mins)
    now= datetime.datetime.now()
    file_list = []
    for root, dirs, files in os.walk(path):
        for a in files:
            path1 = os.path.join(root, a)
            c_time = datetime.datetime.fromtimestamp(os.path.getctime(path1))
            if(now - delta < c_time):
                file_list.append(path1)
    return file_list

最后,如果你打算把这些时间戳发送到其他系统,记得把它们转换成UTC时间(包括文件的和当前的时间)。你可能会想用 pytz 来实现这一点。

撰写回答