这不是教程,是一个普通打工人的生存记录
上周, 同事瞧见我, 在30秒的时间里, 生成了月度销售报表, 便询问我, 是不是使用了什么付费软件。
我打开终端,敲了三行代码:
bash
cd ~/
.py
# 生成完成!文件已保存到:
//.xlsx
同事愣住了:"你还会编程?"
我说不是会编程,是被逼出来的。
为什么选(不是Excel,不是VBA,不是低代码平台)
说实话,我试过很多路子:
在Excel宏/VBA里, 写的时候如同在进行考古那般, 调试的情形恰似去开盲盒那样, 至于跨平台运行是连想都不要去想的事情。
低代码工具:拖拖拉拉配半天,不如直接复制粘贴
付费的自动化软件, 价格高昂, 并且, 每一款软件的运行逻辑均不相同, 学完一款之后, 再去学习另一款, 又需要重新开始学习。
最后选,就一个原因:它是编程界的瑞士军刀。
说的并非是你必须得成为程序员, 然而此门语言自身拥有的特性, 致使这特性专门适宜去做这类“半技术半业务”如此这般的事:
那种语法简单得不像编程语言, 其中的for i in range(10)更是比Excel的=SUM()还好理解 , 这是一种情况。
让人难以想象到的库多, Excel存在着, 网页具备加量版本、邮件存在此物、文件拥有该操作系统版本, 你所需要的基本上都有已准备好现成的那种。
一经编写, 各处运行, Mac、Linux均可运行, 同事若需使用, 发出脚本即可。
我的自动化实战路线(不是系统教程,是踩坑记录)
第一步:环境搭建(跳了好多坑,直接说结论)
别去下载那些"集成环境",官网下原版就行。
我的配置:
# 3.11+(新版本的类型提示太香了)
# VS Code + 插件
说到pip, 必须得用venv虚拟环境, 不然后期会陷入依赖地狱哦。
# 创建项目
mkdir
cd
-m venv venv
venv/bin/ # 用 venv\\
# 装包
pip
第二步:从Excel自动化开始(这个回报最快)
第一个项目:自动合并12个月的销售数据
以往采取的方式是, 将12个Excel文件予以打开, 进行复制粘贴的操作, 对格式加以更改, 开展算汇总的工作, 耗时起码2小时。
做法:
as pd
from Path
# 读取所有月度数据
路径对象Path以字符串形式传入参数'./data', 调用其glob方法, 传入通配符模式'*.xlsx'筛选文件 , 放入files中。
dfs =
pd.(f) for f in files
# 合并、计算、保存
= pd.(dfs)
= .(
'产品', '地区'
).agg({
'销售额': 'sum',
'销量': 'sum'
}).()
关于('年度汇总.xlsx'), 索引为假的情况。
30行代码,5秒出结果。
重心落于具可复用性之上: 下个月之时候, 只需将全新之文件放置到data文件夹那儿, 接着再跑上一次如此之操作即可达成。
第三步:文件系统自动化(这个看似简单,实则最实用)
我的下载文件夹以前是个垃圾堆:
截图、PDF、Excel、安装包混在一起
找文件要翻半天
现在用自动整理:
from Path
= Path('~/')
RULES = {
'.pdf', 其对应的是 '文档/PDF'。
.xlsx格式的文件, 属于文档类别中的Excel类型。
'.png': '图片',
'.jpg': '图片',
在“ .dmg”这里面, 它所对应的是“安装包”。
for file in .():
if file.():
ext = file..lower()
if ext in RULES:
= / RULES
.mkdir(=True, =True)
移动, 将文件转换为字符串形式, 再 将斜杠与文件名拼接转换为字符串形式。
设为定时任务,每天自动跑。下载文件夹永远整整齐齐。
第四步:网页数据抓取(这个是真的省时间)
老板让我每周统计竞品在3个平台的价格。
以手工方式来做: 每个平台都要打开, 之后进行搜索这款产品, 接着记录下该产品的价格, 最后填入表格之中, 每周所需时间为40分钟。
做法:
from bs4
as pd
def 抓取价格(平台, 产品名):
# 每个平台的结构不同,这里简化演示
网址等于, 由“https://”加上那个平台, 再加上“.”, 再加上“com/?q=”, 再加上产品名, 组合而成的字符串。
= {'User - Agent': '以斜杠开头, 后面跟着数字5, 再跟着点, 再跟着零, 省略号部分为其他字符组成的内容\'。
= .get(url, =)
# 找到价格元素(这里要根据实际网页结构调整)
在 soup 里查找, 查找那个标签名为 span , 且属性等于 price 的内容, 以得出查询结果。
将文本中的特定字符(即单引号内的“¥”以及空字符串)转换为浮点数进行处理。
=
“产品A”, “产品B”, “产品C” , 这三个不同的产品 , 各自有着不同的特点呀。
=
data =
for in :
for in :
price = 抓取价格(, )
data.({
'产品': ,
'平台': ,
'价格': price,
'时间': pd..now()
})
df = pd.(data)
读取名为“竞品价格监控.xlsx”的文件, 不设置索引, 输出为格式。
5分钟写完,以后每周跑一次就行。
注意:网页结构经常变,要维护。但总体来说比手动抄快太多了。
第五步:定时任务调度(让脚本自己跑)
库,简单到不像话:
time
from 抓取价格, 发送邮件
def 日常任务():
# 1. 抓取数据
抓取价格()
# 2. 生成报表
生成报表()
# 3. 发送邮件
发送邮件()
print("任务完成")
# 每天早上9点跑
每一天, 在“09 : 00”的时候, 去做日常任务。
while True:
.()
time.sleep(60)
设为开机自启动,真正的"无感自动化"。
我的工具箱里有什么(具体到库和文件结构)
~//
├── venv/ # 虚拟环境
├── /
│ ├── .py # Excel相关
│ ├── .py # 文件整理
│ ├── .py # 网页抓取
│ └── .py # 邮件发送
├── data/
│ ├── / # 模板文件
│ └── raw/ # 原始数据
├── .json # 配置文件
├── .txt # 依赖列表
└── main.py # 主入口
核心库(这些是真的好用):
表格
复制
场景 库 用途
Excel处理 , 读写、计算、合并
文件操作 , , os 路径处理、文件移动
网页抓取 , HTTP请求、HTML解析
定时任务 任务调度
邮件发送 , email 邮件自动化
数据存储 轻量级数据库
踩过的三个大坑(新手必看)
坑1:依赖地狱
最开始是为了贪图省事, 于是直接通过pip去安装包, 然而随后在重新安装系统之后, 却发觉忘掉了都安装了哪些包, 最终脚本全部崩溃了。
解决:始终用虚拟环境+.txt
bash
pip > .txt # 导出依赖
pip -r .txt # 恢复依赖
坑2:硬编码路径
一开始脚本里到处都是
/Users/name//data,换台电脑全废。
解决:用相对路径+配置文件
json
from Path
= json.load(f)
= Path(
''
坑3:没有错误处理
脚本跑着跑着崩了,不知道为什么。
解决:加上try-,日志记录
.(
='.log',
level=.INFO,
='%()s - %()s - %()s'
try:
# 你的代码
pass
as e:
.error(f"出错了: {e}")
从"能用"到"好用"的进阶
初级阶段:写个脚本,自己用
能跑就行,代码烂点无所谓
手动运行,手动填参数
中级阶段:优化代码,给同事用
模块化,拆分成函数和类
配置文件,参数可配置
错误处理,遇到问题不崩
高级阶段:做成工具,可分发
打包成exe()
写文档,齐全
版本控制(Git)
单元测试
我现在在中级和高级之间徘徊。够用就行,不用追求完美。
说实话,这些脚本没什么技术含量
真的。我写的这些脚本,任何一个学过基础的人都能写出来。
然而这偏偏就是要点所在, 即你并非一定要成为算法工程师那般, 并非一定要懂得机器学习相关内容, 并非一定要知晓设计模式方面的知识, 那么你只要:
会基础语法(变量、循环、函数、文件操作)
会用几个核心库(、、os)
会查资料(遇到问题/Stack )
就这么简单。
最后:这不是编程,这是生存技能
现况下, 存有“会运用工具”以及“不太会运用工具”这两种情形, 二者之间的差距, 正以那种可以凭借肉眼清晰瞧见的速率, 不断放大着。
不是讲你非得要学, 你能够运用Excel、采用低代码、借助任何工具, 关键所在是: 你可不可以将重复劳动实现自动化?
只是我选的那个工具,因为它:
免费
强大
易学
通用
如果明天出来个更好的工具,我也会学。
工具不重要,自动化思维才重要。