目录
前言
公司想要一个可以在任何一个Windows电脑上能使用的工具,可以根据Excel表格内容来修改图片的名称,我本来打算用bat脚本实现,但是我发现bat不能读取Excel表格,所以我又想到了用python脚本来实现。
一、实验环境
示例:
根据Excel表格更改图片名称为姓名、学籍号、身份证号中的任意一列。
主要功能:
1、删除文件中的中文字符 2、修改文件身份证号为学籍号 3、修改学籍号为身份证号 4、修改名称为学籍号
二、实现步骤
1.设计思路
首先,图片的名称和Excel中的内容是有关联的,目前的名称是Excel中的身份证的一列,有中文没有关系,我们先写出来一段代码删除中文,后面的就简单了。然后剩下的就是怎么把身份证号的这一列替换成我们想要的任意一列,那就不得不用到python的xlrd库来读取Excel表格,这个库的具体功能,可以自行百度。
能够替换和修改之后,我们还要给一下提示,比如提示备份等,为了避免修改出错后带来不必要的麻烦,要想用到提示框和常规的点击还要用到python的gui模块Tk库,最后我们还要封装成一个exe程序,大致的方向有了,那我们就是边写边补吧。
2.引入库
用到以下几种库没有的可以自行pip 安装一下
代码如下(示例):
import xlrd
import os
import shutil
import tkinter
from tkinter.messagebox import *
import re
3.具体代码
这些是我工作环境中特有的需求,大家也可以照葫芦画瓢,修改成自己需要的功能。
注意!!
此实验文件夹中只能有一个Excel相关文档!
关闭相关Excel文档!否则软件无法运行!(因为python无法读取Excel)
Excel文档的样式是我文中的,不一样的可自行修改代码注释的地方!
代码如下(示例):
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import xlrd
import os
import shutil
import tkinter
from tkinter.messagebox import *
import re
result = showwarning('提示', '修改之前请先做好备份!\n关闭所有项目相关文档!')
print(f'提示: {result}')
window = tkinter.Tk()
window.title('修改名称')
window.geometry('250x160')
describe = tkinter.Label(window, text=" 1、删除文件中的中文字符 \n 2、修改文件身份证号为学籍号 \n 3、修改学籍号为身份证号 \n \
4、修改名称为学籍号 \n\n 请输入数字:", justify="left")
# 输入框大小
describe.place(x=0, y=0)
frame = tkinter.Text(window, width='15', height='1.5')
frame.place(x=25, y=110)
def print_name():
global upfile, before_file, after_file, sheet_names, worksheet
cut = frame.get('1.0', '5.5')
number = cut.strip()
if number == "1":
path = os.getcwd()
files = os.listdir(path)
print(files)
for namefile in files:
if os.path.splitext(namefile)[1] == ".jpg" or os.path.splitext(namefile)[1] == ".JPG":
upfile = re.findall('[\u4e00-\u9fa5]', namefile) # 匹配含有中文的图片
os.rename(path + "\\" + str(namefile), path + "\\" + str(namefile).replace("".join(upfile), "")) # 删除中文
if not upfile:
result1 = showwarning('提示', '无包含中文的图片!')
print(f'提示: {result1}')
else:
result2 = showinfo('提示', '删除完成!')
print(f'提示: {result2}')
elif number == "2":
path = os.getcwd()
file = sorted(os.listdir(path))
for namefile in file:
if os.path.splitext(namefile)[1] == ".xlsx" or os.path.splitext(namefile)[1] == ".xls":
# 获取excel的路径
excel_path = os.path.join(path, namefile)
# 获取sheet表名
try:
worksheet = xlrd.open_workbook(excel_path)
sheet_names = worksheet.sheet_names()
except:
result3 = showwarning('警告', '请关闭相关文档!')
print(f'提示: {result3}')
for sheet_name in sheet_names:
sheet = worksheet.sheet_by_name(sheet_name) # 获取表名
cols_xuejihao = sheet.col_values(1) # 获取列表中第一列的内容 学籍号
cols_id = sheet.col_values(5) # 获取列表中第一列的内容 身份证号
# 修改原文件
errorMsg = ""
for i in range(len(cols_xuejihao)):
if i != 0:
before_file = os.path.join(path, cols_id[i] + ".jpg") # 原文件路径
after_file = os.path.join(path, cols_xuejihao[i] + ".jpg") # 修改后文件文件路径
try:
shutil.move(before_file, after_file) # 身份证修改为学籍号
except:
errorMsg = cols_id[i]
print(errorMsg)
if errorMsg != "":
result4 = showwarning('警告', ' 请检查文件!文档中身份证号与当前文件不匹配!\n 请修改后关闭所有文件点击确定 请勿退出!\n 错误号码为:' + errorMsg)
print(f'提示: {result4}')
else:
result5 = showinfo('提示', '修改完成!')
print(f'提示: {result5}')
elif number == "3":
path = os.getcwd()
file = sorted(os.listdir(path))
for namefile in file:
if os.path.splitext(namefile)[1] == ".xlsx" or os.path.splitext(namefile)[1] == ".xls":
# 获取excel的路径
excel_path = os.path.join(path, namefile)
# 获取sheet表名
try:
worksheet = xlrd.open_workbook(excel_path)
sheet_names = worksheet.sheet_names()
except:
result6 = showwarning('警告', '请关闭相关文档!')
print(f'提示: {result6}')
for sheet_name in sheet_names:
sheet = worksheet.sheet_by_name(sheet_name) # 获取表名
cols_xuejihao = sheet.col_values(1) # 获取列表中第一列的内容 学籍号
cols_id = sheet.col_values(5) # 获取列表中第一列的内容 身份证号
errorMsg = ""
for i in range(len(cols_xuejihao)):
if i != 0:
before_file = os.path.join(path, cols_id[i] + ".jpg") # 原文件路径
after_file = os.path.join(path, cols_xuejihao[i] + ".jpg") # 修改后文件文件路径
try:
shutil.move(after_file,before_file) # 学籍号修改为身份证
except:
errorMsg = cols_id[i]
# print(errorMsg)
if errorMsg != "":
result7 = showwarning('警告', ' 请检查文件!文档中学籍号与当前文件不匹配!\n 请修改后关闭所有文件点击确定 请勿退出!\n 错误号码为:' + errorMsg)
print(f'提示: {result7}')
else:
result8 = showinfo('提示', '修改完成!')
print(f'提示: {result8}')
elif number == "4":
path = os.getcwd()
file = sorted(os.listdir(path))
for namefile in file:
if os.path.splitext(namefile)[1] == ".xlsx" or os.path.splitext(namefile)[1] == ".xls":
# 获取excel的路径
excel_path = os.path.join(path, namefile)
# 获取sheet表名
try:
worksheet = xlrd.open_workbook(excel_path)
sheet_names = worksheet.sheet_names()
except:
result3 = showwarning('警告', '请关闭相关文档!')
print(f'提示: {result3}')
for sheet_name in sheet_names:
sheet = worksheet.sheet_by_name(sheet_name) # 获取表名
cols_name = sheet.col_values(0) # 获取列表中第一列的内容 姓名
cols_xuejihao = sheet.col_values(1) # 获取列表中第一列的内容 学籍号
cols_id = sheet.col_values(5) # 获取列表中第一列的内容 身份证号
# 修改原文件
errorMsg = ""
for i in range(len(cols_xuejihao)):
if i != 0:
before_file = os.path.join(path, cols_xuejihao[i] + ".jpg") # 原文件路径
after_file = os.path.join(path, cols_name[i] + ".jpg") # 修改后文件文件路径
try:
shutil.move(after_file, before_file) # 姓名修改为学籍号
except:
errorMsg = cols_id[i]
print(errorMsg)
if errorMsg != "":
result4 = showwarning('警告',
' 请检查文件!文档中身份证号与当前文件不匹配!\n 请修改后关闭所有文件点击确定 请勿退出!\n 错误号码为:' + errorMsg)
print(f'提示: {result4}')
else:
result5 = showinfo('提示', '修改完成!')
print(f'提示: {result5}')
elif number > "4":
result0 = showinfo('提示', '请输入正确的选项!')
print(f'提示: {result0}')
# 获取输入框大小的方法
b1 = tkinter.Button(window, text='确定', width=5, height=1, command=print_name)
b1.place(x=190, y=110)
# 按钮
window.mainloop()
4.封装成exe程序
这个步骤我用一个大神的教程,分享给大家我就不写了。
学习如可将python脚本封装成.exe执行_流浪法师12的博客-优快云博客_python封装exe
5.功能展示
把封装好的程序放到要修改的文件夹下就可以使用了。
1.备份提示
2.界面展示(此界面由于程序员审美只能这样)
3.删除中文
4.修改身份证号为学籍号
5.修改学籍号为身份证号
6.修改名称为学籍号
修改前:
修改后:
总结
以上就是本次实验的内容其中如果有不对的地方还请各位大佬多多指教。