题图摄于上海,By 町
本文旨在于提供一种零基础写代码的思路,即,完全没接触过代码的同学,如何通过代码去实现一些自己想要的功能,因此,高手请绕行😄
有一个总表,比如产品销量统计表,需要将这个总表按照产品名称拆分成各个产品销量的子表。
当然也可以用最原始的办法去手工操作,但是如果每个月都要去做这样的事情,并不是一次性的操作,那么就要考虑自动化了。方法有很多,你也可以用 VBA,今天简单介绍一下如何用 Python 去处理。
写脚本代码,还是比较轻松愉快的,不像做系统开发,更多的时间花在「想」上,比如考虑系统架构、考虑业务逻辑、考虑合适的技术……等等,最后才是编码过程。而写脚本呢,有时候甚至有点反其道而行之,尤其是对于初学者来说,先写出一个具备核心功能的可运行版本,即便很粗糙,也没关系。本文会着重于「从手工操作的逻辑去实现代码」,而不仅仅是代码本身。
「用 Python 拆分 Excel 表」,关键词在于「拆分」,拆分的业务逻辑是什么呢?我们通过想象一下手工操作会如何进行,来确定这个逻辑。
首先,我们需要知道这个表里有哪些产品 ——— 即,一个产品清单,手工会怎么操作?选中产品名称这一列,然后用 Excel 的数据去重的功能,就得到了一个不重复的产品名称的清单了。到代码里,同理,我们首先让程序读取这张表里的所有数据,然后逐一把产品名称存到一个 List 里,注意,每次存进去之前,判断一下 List 里是否已经存在这个产品名称了。
prd_name_list = []
for i in range(rows):
temp = data['prd_name'][i] #prd_name为表格中产品名称的列名
if temp not in prd_name_list:
prd_name_list.append(temp)
于是,我们得到了一个产品清单 prd_name_list
接下来,我们需要做的是,根据这个产品清单里的每一个产品名称,去找到总表与它匹配的行,把这些行保存起来,存成一个新的表。那么最外面,是一个 prd_name_list
的循环,内层又是一次读总表的过程,同上:
for prd in prd_name_list:
for i in range(rows):
if data['prd_name'] == prd: # 将此行数据保存起来
到这里,主体逻辑其实已经完成了,很简单是不是,其他的都是一些工具类了,用来辅助实现主体逻辑。
那么,我们还剩下哪些工具需要做呢?罗列一下:
读入 Excel 文件
读取 Excel 表中所有行
保存我们筛选出来的行数据
写入到新的 Excel 表文件
拆分成单个工具后,通过搜索引擎查找关键词或者求助专业人士,很容易找到实现的方法。完整的代码如下:
import pandas as pd
# 读入 Excel 文件
data = pd.read_excel('d:\\test.xls')
rows = data.shape[0]
# 获取产品清单
prd_name_list = []
for i in range(rows):
temp = data['prd_name'][i] #prd_name为表格中产品名称的列名
if temp not in prd_name_list:
prd_name_list.append(temp)
# 根据产品名称筛选行并保存到新的文件
for prd in prd_name_list:
df = pd.DataFrame()
for i in range(rows):
if data['prd_name'] == prd: # 将此行数据保存起来
df = pd.concat([df, data.iloc[[i],:]], axis = 0, ignore_index = True)
df.to_excel(prd+'.xls', sheet_name=prd, index = False)
到这里,基本的功能已经实现了。但运行过程中可能还会遇到其他问题,比如,Python 缺少某些模块的问题、常见的中文编码的问题等等,那就对症下药,挨个去解决就行了。
在顺利运行出结果之后,我们再来想想有哪些可以延伸的功能,比如,如果要统计出符合某个条件的产品销量总和并存成一张新表,那怎么通过 Python 来实现呢?Python 在处理 Excel 上还可以做哪些呢,是不是可以画个图表?
另外就是代码中可以优化的地方,比如,可以封装成一个函数,文件名通过变量传进来,这样可以方便地处理有多个源文件的情况,那如果是要处理一个文件夹里的所有 Excel 文件呢?那我们就需要学习 Python 关于文件系统的功能 —— 通过 os.path 遍历文件夹并获取文件名。再延伸一下,如果文件中有英文需要翻译的,Python 可以调用翻译 API 直接去实现……
就这样,我们从开始的一个小功能,实现自己的核心需求后,慢慢延伸和扩展,或许就变成了一个 Python 的练手项目。其实,任何一种编程语言都是如此,我始终认为,上手最重要,只有敲开了这扇门,然后才有机会去细细发掘门背后的奥秘。不要指望一口气吃成一个胖子,也不要等满汉全席都做完了才开吃,两种极端都可不取。
Python 不难,从实现自己的一个小需求开始吧!关于 Python 爬虫,可以参见之前的一篇文章 如何用 Python 写一个最简单的爬虫
发送给作者