我一直在编写一个python脚本来删除文件夹中的文件,如果它们超过x个月。
我可以轻松删除超过一年的文件。 我也可以取两个值,x(一个文件)和y(一个月数),如果它早于y个月,则删除x,假设它们在同一个日历年。
我遇到的问题是年份从一个过去到另一个,但文件x仍然比y个月还年轻。 (例如,如果当前日期是2014年1月并且文件是在2013年12月创建的,则不应删除它,但如果当前日期是2014年1月并且文件在2013年3月被修改,则应删除该文件)。
我试图想出一个基于月号(jan = 01等)来解决这个问题的算法,但我无法理解。我发现我可以使用datetime.timedelta实例来表示两个日期类datetime.timedelta之间的差异。我想从头开始编写代码,或者至少看看它是如何工作的。我找不到python docs中class datetime.timedelta的代码。我想学习如何解决这个问题,而不依赖于我不理解的内置类。任何人都可以帮我理解这个吗?
import os
import time
import math
def main():
path = '/home/gabriel/Documents/bookmarks/'
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
for root, dirs, files in os.walk(path):
print "root:", root
print "dirs:", dirs
print "files:"
for f in files:
mtime = "%s" % time.ctime(os.path.getmtime('%s%s' % (path,f)))
print "\tlast modified: %s %s" % (mtime, f)
weekDay, month, day, HMS, year = mtime.split()
if int(time.strftime("%Y")) - int(year) > 1:
print "\t... deleting %s" % f
os.remove('%s%s' % (path,f))
# elif int(time.strftime("%Y")) - int(year) == 1 & :
# after the & in the elif expression above is what I cannot figure out.
elif abs((months.index(month) + 1)-(int(time.strftime("%m")))) > 4:
print "\t... deleting %s" % f
os.remove('%s%s' % (path,f))
main()
答案 0 :(得分:1)
timedelta
代表一段时间(或两个日期时间之间的差异),以天,秒和微秒表示。
创建timedelta
时,您可以使用其他单位,例如周,小时等,并且在将所有内容标准化以使用简化/任意单位集时,需要进行相当多的数学计算。除此之外,它基本上只是一个尺寸值。
一旦您意识到timedelta
不存储月份或年份,仅存储数天,则日期时间的数学计算(用于减去两个日期或添加timedeltas和日期)也相当简单。日期算术对序数值(date.toordinal()
,date.fromordinal()
)起作用,它们是当前公历中人工向后延伸的从0001-01-01开始的天数的整数表示。然后对秒/微秒和时区差异进行一些调整。
简而言之,几个月本身并没有真正涉及这种日期数学。
现在,让我们谈谈减去几个月。假设一个月是31天对于删除备份这样的事情可能很好。 datetime.now() - timedelta(days=31)
,繁荣,完成,除非出现时区问题。
从长远来看,假设31天的月份可以达到372天。
所以,假设您要减去“实际”月份。您需要查看每个月减去的长度并依次减去它们。但是你减去当前月份的长度来回去一个月或上个月吗?从长远来看,它基本上是平衡的。
答案 1 :(得分:0)
最简单的方法是不使用timedelta。只需将您的时间戳与现在进行比较:
tseconds = time.time() - os.path.getmtime(...)
这是自上次修改以来经过的时间(以秒为单位)。由于您谈论的是几个月的时间表,我不认为您真的关心文件是否在2013年2月1日或1月31日被修改:它们属于不同月份,但无论如何都应该删除。
如果您真的想使用timedelta,请使用该秒数构建它:
tdelta = datetime.timedelta(seconds=tseconds)
但它不会自动给你几个月。同样,你正在大规模工作,你可以假设所有月份都有31天并且是安全的。
答案 2 :(得分:0)
如果您真的想知道timedelta
的实施方式,请在Python库源代码中查找class timedelta
:http://hg.python.org/cpython/file/tip/Lib/datetime.py
如果这是您想知道的,我会要求您编辑您的问题并删除所有不相关的内容(例如源代码和有关删除旧文件的文本)。