Python批量修改文件创建时间、修改时间、访问时间
有些时候,可能是因为项目需求,我们需要进行一些文件的相关时间修改,但是逐个修改太过于麻烦,批量修改的工具有些优势收费的,奈何囊中羞涩,
不得已
写个批量修改的工具来做,一劳永逸,岂不美哉!!!
其实就是没钱
环境准备
1. pypiwin32
2. python3.7.4
3. window10
4. PyCharm
建议安装pypiwin32
,一开始本人安装的是pywin32
,结果在处理pywintypes.Time
的时候一直抛异常,无法进行时间数据的操作,请理智避坑。
运行结果
运行实例:
我的文件命名格式为 【文件名】-yyyymmdd.doc
yyyymmdd
时间留作修改参考依据,时分秒范围内随机生成,我一般控制在18点
以后,这个可以程序里面更具个人需要进行修改。
代码分解
核心代码
这里主要运用win32file
相关接口进行文件时间的操作,不要忘记import modules
from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING
修改文件时间
# 修改文件时间
def modifyFileTime(filePath, createTime, modifyTime, accessTime):
try:
fh = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0)
createTimes, accessTimes, modifyTimes = GetFileTime(fh)
localctime = time.localtime(time.mktime(createTime))
mk = time.mktime(localctime)
#类型转换
createTimes = Time(time.mktime(localctime))
accessTimes = Time(time.mktime(time.localtime(time.mktime(modifyTime))))
modifyTimes = Time(time.mktime(time.localtime(time.mktime(accessTime))))
# 修改
SetFileTime(fh, createTimes, accessTimes, modifyTimes)
CloseHandle(fh)
return True
except Exception as e:
print(e)
return False
获取需要修改的文件列表
在获取文件列表的过程中,发现目录下居然有临时文件,但是资源管理器中找了半天也没发现文件
在哪,估计是系统文件缓存的问题,干脆就搞个.tmp文件的忽略吧
# 获取需要修改的文件列表
def getFiles(file_dir):
fileList = []
for root, dirs, files in os.walk(file_dir):
if len(files) != 0:
for file in files:
if file.find('.tmp') > 0:
print('忽略错误文件: %s'%file)
else:
fileList.append(str(root) + "\\" + str(file))
# print(fileList)
return fileList
获取文件需要修改的时间
def getFileChangeDate(filePath):
try:
createTime = filePath.split('-')[-1].split('.')[0] + '18' + str(random.randint(10, 59)) + str(random.randint(10, 59))
year = createTime[0:4]
month = createTime[4:6]
day = createTime[6:8]
hour = createTime[8:10]
min = createTime[10:12]
sed = createTime[12:14]
createTime = year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sed
return createTime
except Exception as e:
print(e)
return 0
修改文件时间
这里需要注意,format
的格式,我使用的是
#时间格式
format = "%Y-%m-%d %H:%M:%S"
同时我根据自己的需要将创建时间和修改时间拉开了时间间隔,参见 mtime_t
的赋值
# 修改文件时间
def modifyChangeDate(filepath, createTime):
# create struct_time object
ctime_t = time.strptime(createTime, format)
mtime_t = time.strptime((datetime.datetime.strptime(createTime, format) + datetime.timedelta(minutes=random.randint(10, 30)) +datetime.timedelta(seconds=random.randint(0, 60))).strftime(format),format)
atime_t = mtime_t
# change timestamp of file way 1
# os.utime(filepath, (atime_t, mtime_t))
# change timestamp of file way 2
return modifyFileTime(filepath, ctime_t, mtime_t, atime_t)
程序入口
if __name__ == '__main__':
print("/*****************************%s***********************************/"%os.path.basename(__file__).split('.')[0])
print("/*使用方式如下: ")
print("/*1、文件命名格式必须为: 文件名称-日期(如:会议纪要-20200101.doc)")
print("/*2、时间格式必须为: yyyymmdd")
print("/*3、默认创建、修改、访问时间都是18:00以后,取随机时间")
print("/****************************@Author:hou_wenlong************************************/")
print("请输入文件路径>>>")
path = input()
while(len(path) == 0):
print("请输入需要修改文件的路径>>>")
path = input()
currentfile = ''
successcount = 0
failurecount = 0
fileList = getFiles(path)
if fileList is None:
print("未获取到需要修改的文件")
for file in fileList:
try:
currentfile = file
ctime = getFileChangeDate(file)
if modifyChangeDate(file, ctime) == True:
print(file + " 修改完成!")
successcount = successcount + 1
else:
print(file + " 修改失败!")
failurecount = failurecount + 1
except Exception as e:
print("%s 发生错误,错误代码:%s" % (currentfile, e))
failurecount = failurecount + 1
print("本次共修改 %d 个文件, 成功: %d 个,失败: %d 个。"%(len(fileList) , int(successcount), int(failurecount)), "全部完成!!!")
successcount = 0
failurecount = 0
print("/**********************按任意键退出工具********************/")
input()
源码
源码及程序下载:
点击此处下载
如果有用,请给个赞,谢谢