Python 自动化办公系列(02)文件批量更名
# -*- coding: utf-8 -*-
__author__ = 'Hao Jun'
__doc__ = '扫描图档文件批量更名为 "证书编号_姓名" 格式'
'''
2023年以前,盖章后的纸质证书需要通过扫描仪生成电子图档归档。
批量扫描,图档文件名一般为 "{随机字母}日期前缀_{三、四位数字}.jpg/pdf",
需要统一更名为"证书编号_姓名" 格式,方便搜索
'''
import pandas as pd
from enum import Enum
import os
import re
SN_LEGNTH = 4 # 扫描仪自动序号长度
sourceDir = r"H:\TempFiles" # 存放扫描图档文件的目录
lstSourceFileName = None
dicTargetFileName = {} # 新文件名称字典
# 证书信息文档
excelFile = r"工作模板.xlsx"
# 一下是工作模板示例数据。ID表达的是扫描图档的序号,所以纸质证书扫面的顺序必须按照工作模板中的ID顺序。纸质证书按照证书编号排序也是很容易的。
| ID | 人员姓名 | 证书编号 | 电子文档名 |
| 1 | X里 | GDCA8a202212A001 | GDCA8a202212A001_X里.png |
| 2 | XX光 | GDCA8a202212A002 | GDCA8a202212A002_XX光.png |
| 3 | X朋 | GDCA8a202212A003 | GDCA8a202212A003_X朋.png |
| 4 | XX林 | GDCA8a202212A004 | GDCA8a202212A004_XX林.png |
| 5 | X禹 | GDCA8a202212A005 | GDCA8a202212A005_X禹.png |
| 6 | XX赐 | GDCA8a202212A006 | GDCA8a202212A006_XX赐.png |
| 7 | XX军 | GDCA8a202212A007 | GDCA8a202212A007_XX军.png |
| 8 | XX风 | GDCA8a202212A008 | GDCA8a202212A008_XX风.png |
| 9 | XX伟 | GDCA8a202212A009 | GDCA8a202212A009_XX伟.png |
| 10 | XX琴 | GDCA8a202212A010 | GDCA8a202212A010_XX琴.png |
| 11 | X楠 | GDCA8a202212A011 | GDCA8a202212A011_X楠.png |
| 12 | XX峰 | GDCA8a202212A012 | GDCA8a202212A012_XX峰.png |
data = pd.DataFrame(pd.read_excel(excelFile,keep_default_na=False)) # Need install module named 'xlrd'
class KEYS(Enum):
COLUMN_ID = "ID"
COLUMN_NAME = "人员姓名"
COLUMN_CERTCODE = "证书编号"
#COLUMN_CERTTYPE = "证书类型"
# 检查工作模板必要的表头
def chkExcelHead():
excelColumns = data.columns.to_list() # 从 Excel 文件读出来的表头,转换成列表
bExit = True
for oKey in KEYS:
if oKey.value not in excelColumns:
print('在"{0}"中找不到表头"{1}"!'.format(excelFile,oKey.value))
bExit = False
break
return bExit
def file_filter(f):
# 正则表达式:字符开头、后面可能跟一个下划线,序号是两个以上的数字,后缀名是jpg或者pdf
if re.match("^[\w-]+[_]?[\d]{2,}.(jpg|pdf)$",f):
return True
else:
return False
if __name__=='__main__':
if not chkExcelHead():
exit(1) # 第一次发现不存在表头即退出程序
# 这里的file_filter是过滤器函数。在sourceDir中搜索出符合file_filter函数内正则匹配规则的文件名
lstSourceFileName = list(filter(file_filter,os.listdir(sourceDir)))
for i in range(len(data)):
#certType = data.loc[i, KEYS.COLUMN_CERTTYPE.value]
#if certType != "纸质证书": continue # 非纸质证书忽略
id = data.loc[i, KEYS.COLUMN_ID.value]
if id == '': continue # ID 栏位为空的数据忽略
name = data.loc[i, KEYS.COLUMN_NAME.value]
certCode = data.loc[i, KEYS.COLUMN_CERTCODE.value]
# 从 excel 文件中读取序号对应的图档名称(证书编号_姓名)
#dicTargetFileName.update(dict([("{0:03d}".format(int(id)), "{0}_{1}".format(certCode,name))]))
dicTargetFileName.update(dict([(int(id), "{0}_{1}".format(certCode, name))])) # [2023.10.10] 由于新扫描仪缺省四位序号
for sourceFile in lstSourceFileName:
dotIndex = sourceFile.rindex('.')
if '_' in sourceFile:
sn = int(sourceFile[sourceFile.rindex('_')+1:dotIndex]) # 从源文件右边开始搜索下划线
else:
sn = sourceFile[dotIndex-SN_LEGNTH:dotIndex] # 针对定长序号前没有下划线
ext = sourceFile.split('.')[1]
if dicTargetFileName.get(sn) is None:continue
targetFile = dicTargetFileName.get(sn) + '.' + ext
try:
os.rename(sourceDir+"\\"+sourceFile, sourceDir+"\\"+targetFile)
print("rename {0} to {1}".format(sourceFile,targetFile))
except BaseException as e:
print("Error occurred when rename {0} : {1}".format(sourceFile,e))
pass
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526