第一次品嘗鼎泰豐,沒有期待中的驚為天人,但一切都是中規中矩的恰如其分,整體用餐體驗是十分良好。午後的大雷雨勾起許多回憶,重新整理文件,臨時有取出檔案修改時間的需求,一時興起就用 python 完成這個工作並且加以筆記學到的知識點。
處理的程式碼
字串拼湊
初步的構想,能夠動就好。
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 物件