在上面的回答中,我做了两个小工具“Excel自动处理工具”和“商品抓取工具”,有小伙伴想看看教程,所以就有了这篇文章。
一、“excel处理器”是怎样的?
(一)理清工作流程
我的做电商运营的朋友,需要处理许多Excel文件,里面包含电商网站“商品搜索热度”和“全网商品数量”等数据,要从里面找出一些优质的“搜索关键词”,据此上架商品。
每天拿到表格,打开,插入三列空白表格,输入进行计算【竞争激烈度 = 搜索指数 / 全网商品数】【指标A = 某列数据 / 某列数据】【指标B = 某列数据 / 某列数据】
按指标B从大到小排序,删除表格中带有“品牌字样”的关键词
复制优质关键词,到空白表格中。
重复以上步骤25次,大概要用1.5个小时.....
(二)自动化思路
根据上面的流程我做了个工具。
输入屏蔽词(各种品牌的名字),点击【选择文件】和【处理文件】,然后pandas自动计算【市场竞争】【指标A 】【指标B】、删除含有屏蔽词的对象、排序,自动处理25个表格之后,把所有表格复制到空表格,并排序,全部输出到一个文件。
嘿嘿,1.5小时的工作,用时不到3秒完成。
二、教程
现在让我们一步一步代码写出来
(一)传统艺能:引用库
import
(二)创建图形界面,构建程序框架
我们希望写一个什么样的工具呢?有图形界面,能选择文件,能处理文件
#定义一个类
class demo(object):
def __init__(self):
window = tk.Tk() # 创建一个软件窗口
window.geometry('240x160') # 设置窗口大小
window.title('Excel文件处理') # 设置窗口名称
tk.mainloop() # 开启窗口循环
def cho_files(self): # 创建功能:选择文件
pass # 先写个名字,之后再写具体功能
def deal_files(self): # 创建功能:处理多个文件
pass # 同上
def deal_file(self, file): # 创建功能:处理单个文件
pass # 同上
if __name__ == __name__:
demo()
运行一下试试看,yes,框架出来了,不过光秃秃的,没有按钮
(三)加上按钮
def __init__(self):
window = tk.Tk()
window.geometry('240x160')
window.title('Excel文件处理')
# 创建一个按钮,按钮放在window窗口上
# 按钮上的字是“选择文件”,按下后触发功能“cho_files”函数
self.bo_cho = tk.Button(window, text='选择文件', command=self.cho_files)
self.bo_deal = tk.Button(window, text='处理文件', command=self.deal_files)
# 创建一个标签
lable1 = tk.Label(window, text='可在下方输入需要排除的关键词,空格隔开')
# 创建一个多行文本框,放在window窗口上
self.Text_word = tk.Text(window)
# 往多行文本框插入文字“京东 自营 旗舰店 以上”
self.Text_word.insert('insert', '京东 自营 旗舰店 以上')
# 放置按钮等部件(之前只是创建,没有放置)
# pack是一种布局方式,叫“相对布局”。
# 还有其他布局方式:place(绝对布局,就是像输入坐标一样布局)
# grid(网格布局,把界面分为行行列列来布局)
self.bo_cho.pack()
self.bo_deal.pack()
lable1.pack()
self.Text_word.pack()
self.file = None # 定义一个变量,来接收单个文件,例:'D:/product/文件1.xls'
self.files = None # 来接收多个文件,例:('D:/product/文件1.xls', 'D:/product/文件2.xls')
self.file_name = None # 用来接收文件名称,例:‘文件1.xls’
self.files_path = None # 用来接收文件的路径,例:‘D:/product/’
# dataFrame 为一种数据格式,有行和列
# 新建一个表格,表头为“竞争激烈度”等,有两行为“0”的数据
self.content = pd.DataFrame(
{'竞争激烈度': ['0', '0'], '关键词': ['0', '0'], '搜索指数': ['0', '0'], '全网商品数': ['0', '0']})
tk.mainloop()
运行一下
好,现在已经有了按钮,我们可以开始写“选择文件”和“处理文件”的功能了!
(四)功能:选择文件
def cho_files(self): # 定义一个选择文件的函数
# filedialog.askopenfilenames能打开“选择文件的窗口”
# 如果用户选择了“文件1”和“文件2”,那么会返回('D:/product/文件1.xls', 'D:/product/文件2.xls')
# 如果用户没有选择文件(点击了取消),那么会返回空字符串''
self.files = filedialog.askopenfilenames()
# 如果self.files为真,则执行下列代码(空字符串''会被判断为假)
if self.files:
# 取self.files中的第一个,即'D:/product/文件1.xls'
afile = self.files[0]
# 把'D:/product/文件1.xls'用 '/' 切分,并选中最后一个元素,即‘文件1.xls’
filename = afile.split('/')[-1]
# 把 'D:/product/文件1.xls' 中的 ‘文件1.xls’替换成空字符串(效果相当于删掉)
# 得到 'D:/product/'
self.files_path = afile.replace(filename, '')
(五)功能:处理单个文件
def deal_per_file(self, file):
# 提取到文件名‘文件1’
name = file.split('/')[-1].split('.')[0]
# 根据文件路径,读取文件
df = pd.read_excel(file)
#下面只是处理我的文件的方式,大家不一定适用
#把表格中的 ‘-’ 替换成 0
df = df.replace('-', 0)
# 把“搜索指数”这一列数据,转换成浮点数类型
df['搜索指数'] = df['搜索指数'].astype(float)
df['全网商品数'] = df['全网商品数'].astype(float)
# 把 '全网商品数'列 除以 '搜索指数'列,并四舍五入到小数点后两位
# 如果没有'竞争激烈度'这一列,就新建
df['竞争激烈度'] = (df['全网商品数'] / df['搜索指数']).round(decimals=2)
# 重新变列的顺序
df = df.reindex(columns=['竞争激烈度','关键词', '搜索指数', '全网商品数'])
# 根据‘竞争激烈度’这一列的大小排序
df = df.sort_values('竞争激烈度', ascending=False)
# 对'文本输入框'调用get方法,获得输入的“京东 自营 旗舰店 以上”
# 把‘ ’替换成‘|’,得到‘京东|自营|旗舰店|以上’
Text_word = self.Text_word.get('1.0', 'end').replace(' ', '|')
# 选中‘关键词’中包含Text_word的行
Text_word = df['关键词'].str.contains(Text_word)
# 反选
df = df[~Text_word]
# 拼接 self.content 和 df 这两个表格
self.content = pd.concat((self.content, df), axis=0, join='outer')
# 返回 表格的数据 和 表格的名称
return df, name
(六)功能:处理多个文件
def deal_files(self):
# self.files_path 即上文定义的 ‘D:/product/’
# 创建一个Excel写入器,文件生成在 ‘D:/product/总表.xlsx’
writer = pd.ExcelWriter(self.files_path + '总表.xlsx', engine='xlsxwriter')
# 把所有文件路径,依次赋值给 self.file
for self.file in self.files:
# self.deal_per_file 就是我们上个写的函数
# 把单个文件路径传入函数
# 返回“表格数据”和“表格内容”
df, name = self.deal_per_file(self.file)
# 把“表格数据”写入excel文件,并指定写入哪个文件 和 sheet名称
df.to_excel(writer, sheet_name=name)
#循环处理所有文件
# self.content 包含了所有文件的数据
# 把 self.content 按'竞争激烈度'的大小排序
self.content = self.content.sort_values('竞争激烈度', ascending=False)
# 把“表格数据”写入excel文件,并指定写入哪个文件 和 sheet名称
self.content.to_excel(writer, sheet_name='总表')
# 保存这个excel文件
writer.save()
# 重置 self.content
self.content = pd.DataFrame(
{'竞争激烈度': ['0', '0'], '关键词': ['0', '0'], '搜索指数': ['0', '0'], '全网商品数': ['0', '0']})
# 弹出窗口,窗口标题为“成功”,窗口含有信息“成功生成文件。”
messagebox.showinfo(title='成功', message='成功生成文件。')
Yes,鼓掌!!庆贺一下,你已经弄懂“excel处理工具”的原理了。
接下来你可以试着自己把它写出来:先理清需要什么功能,再写出程序框架,最后逐个完善功能。