S系列·修改文件的時(shí)間屬性
S系列·修改文件的時(shí)間屬性
S又稱水,亦可讀作Small,在日常工作學(xué)習(xí)過程中,偶爾會發(fā)現(xiàn)之前沒有看見的、小的、有趣的操作,或許這些操作對于當(dāng)下的問題解決并無意義,仍然想記錄下來,或許能以單獨(dú)寫成一篇完整的文章,則作為流水賬似的記下。
系列文章說明:
S系列·<<文章名稱>>
平臺:
windows 10.0
python 3.8
查看文件的時(shí)間屬性
在windows電腦中,右擊文件,再點(diǎn)擊屬性,能明顯地看到創(chuàng)建時(shí)間,修改時(shí)間和訪問時(shí)間。


三個(gè)時(shí)間的含義如名稱一樣,最容易發(fā)生變動(dòng)的為訪問時(shí)間,只要對文件做了任何操作,都會發(fā)生變化,當(dāng)對文件進(jìn)行修改且保存了,修改時(shí)間就會發(fā)生變化,而創(chuàng)建時(shí)間是在文件創(chuàng)建時(shí)就已經(jīng)設(shè)定了,可看到該文件中創(chuàng)建時(shí)間時(shí)間最早,單獨(dú)對此文件左點(diǎn)右點(diǎn)是很難改變這個(gè)時(shí)間的。
修改文件的時(shí)間屬性
在python中可以用os.stat查看文件的基本屬性,其中包含這三個(gè)時(shí)間屬性。
import?os
os.stat(r"C:\Users\admin\Desktop\1231.xlsx")

時(shí)間屬性均是以時(shí)間戳的方式保存,如果嘗試取出屬性值修改,會產(chǎn)生報(bào)錯(cuò),僅讀屬性不能修改。

os.utime可以幫助修改時(shí)間屬性,但僅能修改訪問時(shí)間和修改時(shí)間,且傳入的時(shí)間參數(shù)應(yīng)當(dāng)為時(shí)間戳。
from?datetime?import?datetime
a_time?=?datetime(2024,?4,?9).timestamp()
m_time?=?datetime(2024,?5,?1).timestamp()
#?分別將訪問時(shí)間和修改時(shí)間修改為2024-04-09和2024-05-01
os.utime(r"C:\Users\admin\Desktop\1231.xlsx",?(a_time,?m_time))
修改完后再次查看文件屬性。

雖然僅能看到修改時(shí)間按設(shè)想成功設(shè)置為2024-05-01,訪問時(shí)間其實(shí)也是設(shè)置好了,但由于太靈活,在設(shè)置修改時(shí)間時(shí),對文件進(jìn)行了訪問,從而設(shè)置成當(dāng)前的操作時(shí)間。
os.utime(filename, (atime, mtime))可形如這樣,atime和mtime可不設(shè)定,默認(rèn)為當(dāng)前時(shí)間戳(s),如傳入,必須為時(shí)間戳浮點(diǎn)型形式,可設(shè)置成ns類型,其為整型數(shù)值。
在os模塊,無直接函數(shù)可以直接對文件創(chuàng)建時(shí)間進(jìn)行修改。
需要使用win32file模塊調(diào)用文件句柄對創(chuàng)建時(shí)間進(jìn)行修改,安裝:pip install pywin32。
from?win32file?import?CreateFile,?SetFileTime,?CloseHandle,?GENERIC_READ,?GENERIC_WRITE,?OPEN_EXISTING
from?datetime?import?datetime
def?modifyFileTime(filepath,?ctime,?mtime,?atime,?format_str="%Y%m%d?%H:%M:%S"):
????"""
????用來修改任意文件的相關(guān)時(shí)間屬性
????:param?filepath:?`str`,?文件路徑
????:param ctime, mtime, atime:?`str`,?時(shí)間格式:20210101 23:59:11
????:param format_str:?`str`,默認(rèn)為:"%Y%m%d %H:%M:%S"
????return
????"""
????#?創(chuàng)建文件句柄
????fh?=?CreateFile(filepath,?GENERIC_READ?|?GENERIC_WRITE,
????????????????????0,?None,?OPEN_EXISTING,?0,?0)
????createTimes?=?datetime.strptime(ctime,?format_str)
????accessTimes?=?datetime.strptime(atime,?format_str)
????modifyTimes?=?datetime.strptime(mtime,?format_str)
????#?設(shè)置時(shí)間
????SetFileTime(fh,?createTimes,?accessTimes,?modifyTimes)
????#?關(guān)閉句柄
????CloseHandle(fh)
使用這種方式可以直接對三個(gè)時(shí)間進(jìn)行修改,GENERIC_READ | GENERIC_WRITE:可讀可寫。如不這樣設(shè)置不能對文件進(jìn)行讀寫修改。
modifyFileTime(r"C:\Users\admin\Desktop\1231.xlsx",?'20240501?01:01:01',?'20240501?02:01:01',?'20240501?03:01:01')
分別對創(chuàng)建時(shí)間設(shè)置成2024年5月1號的1點(diǎn)、2點(diǎn)和3點(diǎn)。

都設(shè)置成功了。
上面的方式使用的參數(shù)還挺多,在os.utime中可以修改訪問時(shí)間和修改時(shí)間,只要再找一個(gè)模塊修改創(chuàng)建時(shí)間就行,而win32_setctime.setctime恰好將上面的修改創(chuàng)建時(shí)間封裝成了函數(shù),再進(jìn)一步組合,parse函數(shù)處理字符串型的時(shí)間可以減少對樣式的考慮。
import?os
from?win32_setctime?import?setctime
from?dateutil.parser?import?parse
def?modifytime(filename,?ctime,?mtime,?atime):
????ctime?=?parse(ctime).timestamp()
????atime?=?parse(atime).timestamp()
????mtime?=?parse(mtime).timestamp()
????setctime(filename,?ctime)
????os.utime(filename,?(atime,?mtime))
使用這個(gè)函數(shù)將文件的創(chuàng)建時(shí)間、修改時(shí)間和訪問時(shí)間分別設(shè)置為2024-05-02的10點(diǎn)、11點(diǎn)、12點(diǎn)。
modifytime(r"C:\Users\admin\Desktop\1231.xlsx",?'20240502?10:00:00',?'20240502?11:00:00',?'20240502?12:00:00')

結(jié)語
通過自身對小例子程序的實(shí)踐,將文件的時(shí)間屬性進(jìn)行修改,對過程進(jìn)行整理,僅做留存使用,不建議去修改文件的時(shí)間屬性。
2022.5.30留
