Python 如何取得檔案時間相關的 metadata


  1. 處理的程式碼
    1. 字串拼湊
    2. 用物件的方式重構實作
    3. 用全域變數的方式重構實作
  2. 小結
  3. 參考資料

第一次品嘗鼎泰豐,沒有期待中的驚為天人,但一切都是中規中矩的恰如其分,整體用餐體驗是十分良好。午後的大雷雨勾起許多回憶,重新整理文件,臨時有取出檔案修改時間的需求,一時興起就用 python 完成這個工作並且加以筆記學到的知識點。

logo

處理的程式碼

字串拼湊

初步的構想,能夠動就好。

for f in os.listdir(path):
    t = time.gmtime(os.path.getmtime(f'{path}\{f}'))
    datetimeString = ''
    datetimeString += str(t.tm_year)
    datetimeString += str(t.tm_mon).zfill(2)
    datetimeString += str(t.tm_mday).zfill(2)
    datetimeString += ' '
    datetimeString += str(t.tm_hour).zfill(2)
    datetimeString += ':'
    datetimeString += str(t.tm_min).zfill(2)
    datetimeString += ':'
    datetimeString += str(t.tm_sec).zfill(2)
    print(datetimeString, f)

用物件的方式重構實作

⚠️ ‘object’ object has no attribute

無法直接以宣告 object 類別的實例並且 setattr 的方式來實作:

obj = object() 
setattr(obj, key, value) #⚠️無法這樣做,直譯器會報錯❌❌❌

因為 object 類別沒有實作 dict 所以無法使用 setattr。但神奇的自定義一個繼承自 object 的類型就會實作 __dict__,便可以使用 setattr。

class DateTimeModel(object):
    pass

for f in os.listdir(path):
    t = time.gmtime(os.path.getmtime(f'{path}\{f}'))

    obj = DateTimeModel()
    for part in ['tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', 'tm_sec']:
        setattr(obj, part.replace('tm_', ''),(str(getattr(t, part)).zfill(2)))
    print(f'{obj.year}{obj.mon}{obj.mday} {obj.hour}:{obj.min}:{obj.sec} {f}')

用全域變數的方式重構實作

⚠️ min 函式會因為全域變數的關係被覆寫

for f in os.listdir(path):
    t = time.gmtime(os.path.getmtime(f'{path}\{f}'))

    for part in ['tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', 'tm_sec']:
        globals()[part.replace('tm_', '')] = str(getattr(t, part)).zfill(2)
    print(f'{year}{mon}{mday} {hour}:{min}:{sec} {f}')

小結

  • os.path.getmtime : 可以取得檔案的修改時間 (epoch format)
  • os.path.getctime : 可以取得檔案的建立時間 (epoch format)
  • os.path.getatime : 可以取得檔案的存取時間 (epoch format)
  • time.gmtime : 可以轉換 epoch format 為日期時間物件
  • getattr : 取得物件的 attribute
  • setattr : 設定物件的 attribute
  • globals() : 會回傳全域變數為 dictionary 物件

參考資料