背景需求:
信息技术2.0培训结束了,教师培训系统内需要批量上传25分的校本培训信息。,并且要求将每个人一份Word"培训体会"的文件名改成“师训号.docx”。再上传。
问卷星收集教师的园本培训小结体会,所以我有一套名称格式相对统一的作业集。
传统方法:docx文件名中的名字,然后在excle里查找师训号,然后选择复制师训号,双击docx文件名,重命名文件,黏贴师训号。 但几十份docx都用这样的方法操作,肯定会产生疲劳暴躁及想不到的错误黏贴结果。
因此希望用python代码批量修改word文件名——指定“名字”转成“师训号”.docx
破解思路:
一、把word文件名改成“姓名”
将大量作业放在“桌面”的“信息技术2.0培训作业”文件夹里
观看小结的样式,其结构为:序号_班组_姓名_ 信息技术2.0培训小结
使用”-“为切割点,需要保留第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)
二、将xls表格放入同一个文件夹内。
excle表格内包含信息:第一列“姓名”,第二列“学号”(师训号)
表内信息作为匹配文件名称用。非常重要。
三、套用现有代码进行替换。
直接运行以下代码
# 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()
输入文件路径:复制文件所在路径
(本代码,是先将“张三.docx" 转成“张三170121122322.docx”再转成“170121122322.docx”)
运行后结果
上传匹配情况:培训系统自动上传研究成果(师训号.docx),并显示未上传人员信息(便于补全)
感悟:
本次找代码并调试、添加新代码,花了2个多小时,如果人工批量修改60个文件名估计也差不多的时间。但是确定了这个代码,就能够反复运用,特别是对于大批量的数据(>100个)非常有效果(速度、精确性)。