我有以下代码。我正在从目录中提取文件,并尝试检查它们是否在过去24小时内创建,但是我似乎无法找出正确的时间或日期时间函数来用来将创建时间与from和to日期进行比较:
def checkdirectory(folder_paths):
#loop through and check directories for new files
file_list = []
for path in folder_paths:
from_date = datetime.datetime.now() - datetime.timedelta(days=-1)
to_date = datetime.datetime.now()
files = glob.glob(path['folder_path'] + path['file_filter'])
for file in files:
create_time = os.path.getctime(file)
print(create_time)
if datetime.time(create_time) >= from_date and datetime.time(create_time) <= to_date:
file_list.append(file)
答案 0 :(得分:1)
这有两个问题:
datetime.time(create_time)
首先,您要构造一个time
对象,该对象代表一个:
一天中的时间,与任何特定的日子无关
换句话说,它表示类似“ 10:30:00.000”,而不是“ 2018-Aug-29 10:30:00.000”。因此,如果您要查找“比昨天更新”的文件,这没什么用。您想要的是一个datetime
对象。
第二,您不能只是在构造函数上抛出一些随机值,并希望它是对的。
getctime
函数是:
给出自纪元以来的秒数的数字
time
构造函数采用:
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
datetime
构造函数采用:
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
因此,您有几秒钟的时间,并且试图将其用作一个小时或一年。
您要使用的功能是fromtimestamp
:
返回与POSIX时间戳相对应的本地日期和时间
所以,您想要的是:
datetime.datetime.from_timestamp(create_time)
另外,请注意getctime
返回的内容是:
系统的ctime,在某些系统(如Unix)上,它是最后一次元数据更改的时间,而在其他系统(如Windows)上,它是创建时间。
因此,将其用于名为create_time
的东西充其量是不可移植且特定于Windows的,而在最坏的情况下(如果您实际上不在Windows上)是错误的。
也:
from_date = datetime.datetime.now() - datetime.timedelta(days=-1)
您减去-1天,与添加1天相同。
因此,您寻找的是未来24小时以上的文件,而不是寻找不到24小时的文件。使用+
或使用days=1
。
我们在这里:
if datetime.time(create_time) >= from_date and datetime.time(create_time) <= to_date:
为什么不创建两次timestamp对象并进行两次单独的比较,为什么不使用链式比较呢?
if from_date <= datetime.datetime.from_timestamp(create_time) <= to_date:
或者,也许更好,将构造移出测试:
create_time = datetime.datetime.from_timestamp(os.path.getctime(file))
if from_date <= create_time <= to_date: