背景需求:

      信息技术2.0培训结束了,教师培训系统内需要批量上传25分的校本培训信息。,并且要求将每个人一份Word"培训体会"的文件名改成“师训号.docx”。再上传。

doc文档 自动设置标题 python python docx 标题编号_开发语言

问卷星收集教师的园本培训小结体会,所以我有一套名称格式相对统一的作业集。

传统方法:docx文件名中的名字,然后在excle里查找师训号,然后选择复制师训号,双击docx文件名,重命名文件,黏贴师训号。   但几十份docx都用这样的方法操作,肯定会产生疲劳暴躁及想不到的错误黏贴结果。

doc文档 自动设置标题 python python docx 标题编号_开发语言_02

doc文档 自动设置标题 python python docx 标题编号_前端_03

 因此希望用python代码批量修改word文件名——指定“名字”转成“师训号”.docx

破解思路:

      一、把word文件名改成“姓名”

      将大量作业放在“桌面”的“信息技术2.0培训作业”文件夹里

doc文档 自动设置标题 python python docx 标题编号_doc文档 自动设置标题 python_04

观看小结的样式,其结构为:序号_班组_姓名_ 信息技术2.0培训小结

doc文档 自动设置标题 python python docx 标题编号_前端_05

  使用”-“为切割点,需要保留第2组内容“姓名”,并加上"docx“后缀。

import os
import time
path =r"C:\Users\jg2yXRZ\OneDrive\桌面\信息技术2.0培训小结"

fileList=os.listdir(path)
# 删除“_请将培训小结.docx上传(电_)
for file in fileList:

  split_str = file.split('_')
  newname1 = split_str[2]  # _的第0部分=序号 
  # split_str = file.split('培')
  # newname2 = split_str[1] 
  # _的第2部分=“()+后面的内容” 
  

  newname=newname1+ '.docx'
  oldname_path = os.path.join(path,file)
  # 文件新路径
  newname_path = os.path.join(path,newname)
  # 新旧对调
  os.rename(oldname_path, newname_path)

运行后的文件名批量转化为“姓名.docx)

doc文档 自动设置标题 python python docx 标题编号_java_06

二、将xls表格放入同一个文件夹内。

doc文档 自动设置标题 python python docx 标题编号_doc文档 自动设置标题 python_07

 excle表格内包含信息:第一列“姓名”,第二列“学号”(师训号)

doc文档 自动设置标题 python python docx 标题编号_前端_08

 表内信息作为匹配文件名称用。非常重要。

三、套用现有代码进行替换。

直接运行以下代码

# https://www.jb51.net/article/247374.htm
import os
import xlwings as wx
import time
def listdir(path, list_name):  #传入存储的list
    for file in os.listdir(path):
        # 排除临时的文件
        if '~$' in file:
            continue
 
        # 取得照片清单 源文件
        if ".docx" in file:
            file_path = os.path.join(path,file)
            list_name.append(file_path)
 
        # 取得excel文件 修改表
        if ".xls" in file:
            index_file = os.path.join(path,file)
            print("数据源文件-->"+index_file)
 
    print(list_name)
    return index_file
 
def getinfo(new_name,index_file):          # 获取人员姓名和编号
    app = wx.App(visible=False, add_book=False) # 不打开baiexcel
    print("读取人员信息--->"+index_file)
    wb = app.books.open(index_file)
    sheet = wb.sheets[0]
 
    nrows    = sheet.used_range.last_cell.row       #获取最大行数
    ncolumns = sheet.used_range.last_cell.column    #获取最大列数
 
    # 查找姓名和编号的列
    file_name = ""
    empl_name = ""
    empl_numb = ""
    ename_col = 0
    enumb_col = 0
 
    print("最大列数--->"+str(ncolumns))  # 2
 
    for col in range(1, ncolumns+1):
        if sheet.range((1,col)).value == "姓名":
            ename_col = col
            print("姓名的列--->"+str(col))            # 1
         
        if sheet.range((1,col)).value == "学号":
            enumb_col = col
            print("员工号的列--->"+str(col))           # 2
 
    # 取行中的姓名和编号
    for row in range(2,nrows+1):
        empl_name = str(sheet.range((row,ename_col)).value)
        empl_numb = str(sheet.range((row,enumb_col)).value)
        file_name = (empl_name + empl_numb).split('.')[0]       # 新的名字
        print(file_name)
        new_name.append(file_name)
 
    # print(new_name)
 
    wb.close()
    app.quit()
 
def change_name(file_path,new_name,list_name):
    # 逐个处理docx
    for filename in list_name:        # 文件名遍历列表名单
        print("旧文件名"+filename) # 打印就文件名=列表名字单 路径+XXX.docx
        old_name = (os.path.basename(filename)).split('.')[0]# 提取老名字=XXX(无。docx)
        print(old_name)
        # 查找新名字清单中是否有此姓名
        for nfile in new_name:  # 新文件 遍历新文件名 ,新文件名=有名字的
            print(nfile)
            if old_name in nfile:                # 如果老名字在新文件内(存在)
                nfname = file_path+os.sep+nfile+".docx"
                # 新名字=路径+分隔符+名字学号+docx  XX123214.docx
                print("新文件名"+nfname)
                os.rename(filename,nfname)                # 替换
                break
def main():
    file_path = input('输入文件夹路径:') # 文件夹位置
    # global(file_path)
    try:
        #读取文件夹下的所有文件
        List_files=[]
        index_file = listdir(file_path,List_files)
 
        # 读取员工姓名和员工号,组成新的文件名
        new_name=[]
        getinfo(new_name,index_file)
 
        # 修改文件名字
        change_name(file_path,new_name,List_files)
 
    except Exception as  e:
        # 打印异常信息
        print(e)

    time.sleep(3)

    fileList=os.listdir(file_path)
    for file in fileList:  
        # split_str = file.split('1')#+后面的写错了,就用这个提取前面的部分和后缀一起重新命名
        split_str = file[-17:]
        # 提取最后进修编号
        newname1 = split_str
        # newname2 = split_str[1]

        newname=newname1
        oldname_path = os.path.join(file_path,file)
        # 文件新路径
        newname_path = os.path.join(file_path,newname)
        # 新旧对调
        os.rename(oldname_path, newname_path)
 
if __name__ == '__main__':
    main()

输入文件路径:复制文件所在路径

doc文档 自动设置标题 python python docx 标题编号_doc文档 自动设置标题 python_09

doc文档 自动设置标题 python python docx 标题编号_doc文档 自动设置标题 python_10

(本代码,是先将“张三.docx" 转成“张三170121122322.docx”再转成“170121122322.docx”)

运行后结果

doc文档 自动设置标题 python python docx 标题编号_文件名_11

 上传匹配情况:培训系统自动上传研究成果(师训号.docx),并显示未上传人员信息(便于补全)

doc文档 自动设置标题 python python docx 标题编号_doc文档 自动设置标题 python_12

 感悟:

       本次找代码并调试、添加新代码,花了2个多小时,如果人工批量修改60个文件名估计也差不多的时间。但是确定了这个代码,就能够反复运用,特别是对于大批量的数据(>100个)非常有效果(速度、精确性)。