問(wèn)題
用mylio整理照片,發(fā)現(xiàn)它會(huì)按照照片的拍照時(shí)間自動(dòng)對(duì)照片歸類(lèi)。但是,有的視頻的時(shí)間明顯不對(duì),一番折騰后發(fā)現(xiàn)問(wèn)題所在

image.png
很明顯,照片的創(chuàng)建時(shí)間和修改時(shí)間不對(duì),對(duì)比下文件名就知道了,而mylio是按照創(chuàng)建時(shí)間來(lái)歸類(lèi)的
要是一個(gè)文件也就罷了,但是這些年實(shí)在攢了太多視頻了,例如2017年視頻被放到2018年的文件

image.png
還是寫(xiě)個(gè)腳本批量修改吧
解決過(guò)程
搜了很久,網(wǎng)上主要是修改訪問(wèn)時(shí)間atime和修改時(shí)間mtime,通過(guò)os.utime(filename,(atime,mtime))方法來(lái)做,但是,沒(méi)有簡(jiǎn)單的修改創(chuàng)建時(shí)間ctime的方法
發(fā)現(xiàn)了這個(gè)
https://github.com/Delgan/win32-setctime
使用pip安裝后,可以使用
from win32_setctime import setctime
setctime("my_file.txt", 1561675987.509)
那串?dāng)?shù)字是epoch time,所以,需要將時(shí)間轉(zhuǎn)換為epoch time,使用time.strptime()和time.mktime()即可
測(cè)試下
>>> import time
>>> filename='VID_20170919_223923.mp4'
>>> pattern='VID_%Y%m%d_%H%M%S.mp4'
>>> newtime=time.strptime(filename,pattern)
>>> newtime
Out[7]: time.struct_time(tm_year=2017, tm_mon=9, tm_mday=19, tm_hour=22, tm_min=39, tm_sec=23, tm_wday=1, tm_yday=262, tm_isdst=-1)
>>> newtime_stamp=time.mktime(newtime)
>>> from win32_setctime import setctime
>>> setctime(filename, newtime_stamp)
>>> import os
>>> os.utime(filename,(newtime_stamp,newtime_stamp))
成功!
最終方案
from win32_setctime import setctime
import time
import os
filenames=os.listdir()
for filename in filenames:
# check whether it has the form VID_....mp4
filename=filename.strip()
if filename.startswith('VID') and filename.endswith('.mp4'):
print(filename)
pattern='VID_%Y%m%d_%H%M%S.mp4'
newtime=time.strptime(filename,pattern)
newtime_stamp=time.mktime(newtime)
setctime(filename,newtime_stamp)
os.utime(filename,(newtime_stamp,newtime_stamp))