簡體   English   中英

類datetime.timedelta如何工作?

[英]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 timedeltahttp : class timedelta

如果那是您想知道的,我會請您編輯問題並刪除所有不相關的內容(例如源代碼和有關刪除舊文件的文本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM