[英]How does class datetime.timedelta work?
我一直在編寫python腳本來刪除文件夾中的文件(如果文件的年限超過x個月)。
我可以輕松刪除超過一歲的文件。 我還可以采用x(文件)和y(月數)這兩個值,並假設x早於y個月(如果它們在同一日歷年),則將其刪除。
我遇到的問題是當年份從一年到下一年,但是文件x仍小於y個月。 (例如,如果當前日期是2014年1月,並且文件是在2013年12月創建的,則不應將其刪除,但是如果當前日期是2014年1月,並且文件是在2013年3月進行了修改,則應該刪除該文件)。
我試圖根據月數(jan = 01,等等)提出一種算法來解決這個問題,但是我無法弄清楚。 我發現我可以使用datetime.timedelta實例來表示兩個日期類datetime.timedelta之間的差異。 我想從頭開始編寫代碼,或者至少看看它是如何工作的。 我在python文檔中找不到類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()
timedelta
表示時間長度(或兩個日期時間之間的差),以天,秒和微秒表示。
創建時間timedelta
您可以使用其他單位,例如星期,小時等,並且在標准化所有內容以使用簡化/任意單位集方面涉及很多數學運算。 除此之外,它基本上只是一個尺寸值。
一旦意識到timedelta
不會存儲幾個月或幾年,而只會存儲幾天,則datetime中的數學運算(用於減去兩個日期或添加timedelta和日期)也非常簡單。 日期算術適用於序號值( date.toordinal()
, date.fromordinal()
),這是當前公歷中從0001-01-01開始的天的整數表示,它是人為地向后擴展。 然后,對秒/微秒和時區差異進行了一些調整。
簡而言之,這種日期數學實際上並不涉及數月。
現在,讓我們談談減去月份。 假設一個月是31天,那么對於刪除備份之類的事情就可以了。 datetime.now() - timedelta(days=31)
,繁榮,完成,除非存在時區問題。
但是,從長遠來看,假設31天的月份可以得出372天的年份。
假設您要減去“實際”月份。 您需要查詢要減去的每個月的長度,然后依次減去它們。 但是,您要減去當前月份的長度還是上個月還是最后一個月? 從長遠來看,它基本上會穩定下來。
最簡單的方法是不使用timedelta。 只需將您的時間戳與現在進行比較:
tseconds = time.time() - os.path.getmtime(...)
這是自上次修改以來經過的時間(以秒為單位)。 由於您談論的是幾個月的時間表,因此我認為您並不在乎文件是在2013年2月1日還是1月31日被修改的:它們屬於不同的月份,但無論如何都應該刪除。
如果您真的想使用timedelta,請使用該秒數來構造它:
tdelta = datetime.timedelta(seconds=tseconds)
但這不會自動給您幾個月。 同樣,您正在大規模工作,可以假設所有月份都有31天並且是安全的。
如果您真的想知道timedelta
實現方式,請在Python庫源代碼中查找class timedelta
: http : class timedelta
如果那是您想知道的,我會請您編輯問題並刪除所有不相關的內容(例如源代碼和有關刪除舊文件的文本)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.