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()

源码

源码及程序下载:
点击此处下载
如果有用,请给个赞,谢谢

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值